git ssb

1+

punkmonk.termux / mvd



forked from ev / mvd

Commit bea0d6f86662e5db7348deb37bef697f1226edae

initial standalone ssb-server implementation. will also serve ssb-webified apps

austinfrey committed on 4/8/2019, 11:52:38 PM
Parent: a425ae10c31740a80df9cd0fb2c15de82b6bad4f

Files changed

.gitignorechanged
bin.jschanged
config.jschanged
config/inject.jschanged
package.jsonchanged
avatar.jsdeleted
compose.jsdeleted
index.jsdeleted
keys.jsdeleted
package-lock.jsonadded
mvd-indexes.jsdeleted
public/favicon.icoadded
public/favicon_io.zipadded
mvd.pngdeleted
query/index.jsdeleted
ui/avatar.jsadded
ui/compose.jsadded
ui/index.jsadded
ui/keys.jsadded
ui/mvd-indexes.jsadded
ui/render.jsadded
ui/style.cssadded
ui/style.css.jsonadded
ui/style.jsadded
ui/tools.jsadded
ui/views.jsadded
render.jsdeleted
scuttlebot.jsdeleted
style.cssdeleted
style.css.jsondeleted
style.jsdeleted
tools.jsdeleted
views.jsdeleted
.gitignoreView
@@ -1,3 +1,4 @@
11 build
22 node_modules
33 .ssb-web
4 +NOTES.md
bin.jsView
@@ -1,76 +1,125 @@
11 var fs = require('fs')
22 var path = require('path')
33 var ssbKeys = require('ssb-keys')
44 var stringify = require('pull-stringify')
5-var open = require('opn')
5 +var open = require('open')
66 var home = require('os-homedir')()
77 var nonPrivate = require('non-private-ip')
88 var muxrpcli = require('muxrpcli')
9 +var {pull, values, once} = require('pull-stream')
10 +var toPull = require('stream-to-pull-stream')
11 +const webresolve = require('ssb-web-resolver')
912
1013 var SEC = 1e3
1114 var MIN = 60*SEC
1215
13-var network = 'ssb'
14-//var network = 'decent'
15-//var network = 'testnet'
16-
16 +var network = process.env.ssb_appname || 'ssb'
1717 var config = require('./config/inject')(network)
1818
19 +var urlIdRegex = /^(?:\/(([%&@]|%25|%26|%40)(?:[A-Za-z0-9\/+]|%2[Ff]|%2[Bb]){43}(?:=|%3[Dd])\.(?:sha256|ed25519))(?:\.([^?]*))?|(\/.*?))(?:\?(.*))?$/
20 +
1921 config.keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret'))
2022
2123 var mvdClient = fs.readFileSync(path.join('./build/index.html'))
24 +var favicon = fs.readFileSync(path.join('./public/favicon.ico'))
2225
2326 var manifestFile = path.join(config.path, 'manifest.json')
2427
2528 var argv = process.argv.slice(2)
2629 var i = argv.indexOf('--')
2730 var conf = argv.slice(i+1)
2831 argv = ~i ? argv.slice(0, i) : argv
2932
30-if (argv[0] == 'server') {
31-
32- var createSbot = require('scuttlebot-release/node_modules/scuttlebot')
33- .use(require('scuttlebot-release/node_modules/scuttlebot/plugins/master'))
34- .use(require('scuttlebot-release/node_modules/scuttlebot/plugins/gossip'))
35- .use(require('scuttlebot-release/node_modules/scuttlebot/plugins/replicate'))
33 +if (argv[0] == 'start') {
34 +
35 + var createSbot = require('ssb-server')
36 +
37 + createSbot
38 + .use(require('ssb-server/plugins/master'))
39 + .use(require('ssb-replicate'))
3640 .use(require('ssb-friends'))
41 + .use(require('ssb-gossip'))
3742 .use(require('ssb-blobs'))
3843 .use(require('ssb-backlinks'))
39- .use(require('./query'))
44 + .use(require('ssb-query'))
4045 .use(require('ssb-links'))
4146 .use(require('ssb-ebt'))
4247 .use(require('ssb-search'))
43- .use(require('scuttlebot-release/node_modules/scuttlebot/plugins/invite'))
44- .use(require('scuttlebot-release/node_modules/scuttlebot/plugins/local'))
45- .use(require('decent-ws'))
48 + .use(require('ssb-server/plugins/local'))
49 + .use(require('ssb-ws'))
4650 .use({
4751 name: 'serve',
4852 version: '1.0.0',
4953 init: function (sbot) {
54 + console.log(sbot.getAddress())
5055 sbot.ws.use(function (req, res, next) {
5156 var send = config
57 +
5258 delete send.keys // very important to keep this, as it removes the server keys from the config before broadcast
53- send.address = sbot.ws.getAddress()
54- sbot.invite.create({modern: true}, function (err, cb) {
55- send.invite = cb
56- })
57- if(req.url == '/')
58- res.end(mvdClient)
59- if(req.url == '/get-config')
60- res.end(JSON.stringify(send))
61- else next()
59 +
60 + send.address = 'ws://100.115.92.2:8989~shs:VelntasZy86CuIihzSpkzPvIOYgyu3FO3NZww/UOirk='
61 +
62 + //sbot.invite.create({modern: true}, function (err, cb) {
63 + // send.invite = cb
64 + //})
65 +
66 + var m = urlIdRegex.exec(req.url)
67 +
68 + if(req.url == '/') {
69 + console.log('/')
70 + return res.end('<h1>/</h1>')
71 + }
72 + if(req.url.startsWith('/web/')) {
73 + return serveWeb(req, res, m[4])
74 + }
75 + if(req.url == '/get-config') {
76 + console.log('/get-config')
77 + return res.end(JSON.stringify(send))
78 + }
79 + if(req.url == '/favicon.ico') {
80 + console.log('/favicon')
81 + return res.end(favicon)
82 + } else next()
83 +
84 + function respond(res, status, message) {
85 + res.writeHead(status)
86 + res.end(message)
87 + }
88 +
89 + function serveWeb (req, res, url) {
90 + var self = this
91 + var id = decodeURIComponent(url.substr(1))
92 +
93 + var components = url.split('/')
94 + if (components[0] === '') components.shift()
95 + if (components[0] === 'web') components.shift()
96 + components[0] = decodeURIComponent(components[0])
97 +
98 + webresolve(sbot, components, function (err, data) {
99 + console.log(err)
100 + if (err) return respond(res, 404, 'ERROR: ' + err)
101 +
102 + function onError(err) {
103 + if (err) console.error('[viewer]', err)
104 + }
105 +
106 + return pull(once(data), toPull(res))
107 + })
108 + }
62109 })
63110 }
64111 })
65-
66- open('http://localhost:' + config.ws.port, {wait: false})
67-
68- var server = createSbot(config)
69-
70- fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
71-} else {
72112
113 + // open('http://localhost:' + config.ws.port, {wait: false})
114 +
115 + // start server
116 + var server = createSbot(config)
117 +
118 + fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
119 +}
120 +else {
121 +
73122 var manifest
74123 try {
75124 manifest = JSON.parse(fs.readFileSync(manifestFile))
76125 } catch (err) {
config.jsView
@@ -2,9 +2,9 @@
22
33 module.exports = function () {
44 //var host = window.location.origin
55
6- var host = 'http://100.115.92.2:8989'
6 + var host = 'http://100.115.92.2:9191'
77
88 function getConfig () {
99 http.get(host + '/get-config', function (res) {
1010 res.on('data', function (data, remote) {
@@ -25,9 +25,9 @@
2525 }
2626
2727 config.blobsUrl = host + '/blobs/get/'
2828 config.emojiUrl = host + '/img/emoji/'
29-
29 + console.log(config)
3030 if (config.ws.remote)
3131 config.remote = config.ws.remote
3232 else
3333 config.remote = config.address
config/inject.jsView
@@ -29,29 +29,29 @@
2929 network = {
3030 port: 3333,
3131 ws: {
3232 port: 3939
33- },
34- caps: {
33 + },
34 + caps: {
3535 shs: 'EVRctE2Iv8GrO/BpQCF34e2FMPsDJot9x0j846LjVtc=',
36- sign: null
36 + sign: null
3737 }
3838 }
3939 }
4040
41- if (name === 'testnet') {
42- network = {
41 + if (name === 'ssb_testnet') {
42 + network = {
4343 port: 9999,
4444 ws: {
4545 port: 9191
46- },
46 + },
4747 caps: {
4848 shs: 'sR74I0+OW6LBYraQQ2YtFtqV5Ns77Tv5DyMfyWbrlpI=',
49- sign: null
49 + sign: null
5050 }
5151 }
5252 }
53-
53 +
5454 var HOME = home() || 'browser' //most probably browser
5555
5656 return RC(name, merge(network, {
5757 name: name,
package.jsonView
@@ -7,19 +7,19 @@
77 "start": "node bin server",
88 "decent": "node bin server --appname=decent",
99 "ssb": "node bin server --appname=ssb",
1010 "testnet": "node bin server --appname=testnet",
11- "build": "node style.js && mkdir -p build && browserify index.js | indexhtmlify > build/index.html"
11 + "build": "node ui/style.js && mkdir -p build && browserify ui/index.js | indexhtmlify > build/index.html"
1212 },
1313 "devDependencies": {
1414 "browserify": "^16.2.2",
1515 "indexhtmlify": "^1.3.1"
1616 },
1717 "author": "Ev Bogue <ev@evbogue.com>",
1818 "license": "MIT",
1919 "dependencies": {
20 + "chloride": "^2.2.14",
2021 "dataurl-": "^0.1.0",
21- "decent-ws": "1.0.4",
2222 "deep-extend": "^0.6.0",
2323 "diff": "^3.5.0",
2424 "emoji-server": "^1.0.0",
2525 "human-time": "0.0.1",
@@ -29,32 +29,41 @@
2929 "hyperscroll": "^1.0.0",
3030 "multiblob-http": "^0.4.2",
3131 "muxrpcli": "^1.1.0",
3232 "non-private-ip": "^1.4.3",
33- "opn": "^5.3.0",
33 + "open": "^6.1.0",
3434 "os-homedir": "^1.0.2",
35 + "patch-package": "^6.1.0",
3536 "pull-more": "^1.1.0",
3637 "pull-next-query": "^1.0.0",
3738 "pull-reconnect": "0.0.3",
38- "pull-stream": "^3.6.8",
39 + "pull-stream": "^3.6.9",
3940 "pull-stringify": "^2.0.0",
4041 "rc": "^1.2.7",
41- "scuttlebot-release": "ssbc/scuttlebot-release#11.3.x-fixups",
4242 "simple-mime": "^0.1.0",
4343 "split-buffer": "^1.0.0",
4444 "ssb-avatar": "^0.2.0",
4545 "ssb-backlinks": "^0.7.1",
4646 "ssb-blobs": "^1.1.5",
4747 "ssb-client": "^4.5.7",
4848 "ssb-ebt": "^5.1.5",
4949 "ssb-feed": "^2.3.0",
50- "ssb-friends": "^2.4.0",
50 + "ssb-friends": "^3.1.6",
51 + "ssb-gossip": "^1.0.6",
52 + "ssb-invite": "^2.0.4",
5153 "ssb-keys": "^7.0.16",
5254 "ssb-links": "^3.0.3",
5355 "ssb-markdown": "^3.6.0",
5456 "ssb-mentions": "^0.5.0",
57 + "ssb-query": "^2.3.0",
5558 "ssb-ref": "^2.11.1",
59 + "ssb-replicate": "^1.2.3",
5660 "ssb-search": "^1.0.1",
61 + "ssb-server": "^13.6.3",
62 + "ssb-viewer": "^1.0.0",
63 + "ssb-web-resolver": "^1.1.2",
64 + "ssb-ws": "^6.0.0",
5765 "stack": "^0.1.0",
66 + "stream-to-pull-stream": "^1.7.3",
5867 "visualize-buffer": "0.0.1"
5968 }
6069 }
avatar.jsView
@@ -1,92 +1,0 @@
1-var pull = require('pull-stream')
2-var query = require('./scuttlebot').query
3-var h = require('hyperscript')
4-var visualize = require('visualize-buffer')
5-
6-var avatar = require('ssb-avatar')
7-
8-var sbot = require('./scuttlebot')
9-
10-var config = require('./config')()
11-
12-var id = require('./keys').id
13-
14-var ref = require('ssb-ref')
15-
16-module.exports.name = function (key) {
17-
18- var avatarname = h('span', key.substring(0, 10))
19- if (ref.isFeedId(key)) {
20- avatar(sbot, id, key, function (err, data) {
21- if (err) throw err
22- if (data.name) {
23- if (data.name[0] != '@') {
24- var name = '@' + data.name
25- } else {
26- var name = data.name
27- }
28- localStorage[key + 'name'] = name
29- avatarname.textContent = name
30- }
31- })
32- }
33- return avatarname
34-}
35-
36-module.exports.image = function (key) {
37- var img = visualize(new Buffer(key.substring(1), 'base64'), 256)
38-
39- if (ref.isFeedId(key)) {
40- avatar(sbot, id, key, function (err, data) {
41- if (err) throw err
42- if (data.image) {
43- localStorage[key + 'image'] = data.image
44- img.src = config.blobsUrl + data.image
45- }
46- })
47- }
48- return img
49-}
50-
51-module.exports.cachedName = function (key) {
52- var avatarname = h('span', key.substring(0, 10))
53-
54- if (localStorage[key + 'name']) {
55- avatarname.textContent = localStorage[key + 'name']
56- } else {
57- if (ref.isFeedId(key)) {
58- avatar(sbot, id, key, function (err, data) {
59- if (data.name) {
60- if (data.name[0] != '@') {
61- var name = '@' + data.name
62- } else {
63- var name = data.name
64- }
65- localStorage[key + 'name'] = name
66- avatarname.textContent = name
67- }
68- })
69- }
70- }
71-
72- return avatarname
73-}
74-
75-module.exports.cachedImage = function (key) {
76- var img = visualize(new Buffer(key.substring(1), 'base64'), 256)
77-
78- if (localStorage[key + 'image']) {
79- img.src = config.blobsUrl + localStorage[key + 'image']
80- } else {
81- if (ref.isFeedId(key)) {
82- avatar(sbot, id, key, function (err, data) {
83- if (data.image) {
84- localStorage[key + 'image'] = data.image
85- img.src = config.blobsUrl + data.image
86- }
87- })
88- }
89- }
90-
91- return img
92-}
compose.jsView
@@ -1,187 +1,0 @@
1-var h = require('hyperscript')
2-var pull = require('pull-stream')
3-var sbot = require('./scuttlebot')
4-var human = require('human-time')
5-var id = require('./keys').id
6-var mentions = require('ssb-mentions')
7-
8-var avatar = require('./avatar')
9-var tools = require('./tools')
10-
11-var mime = require('simple-mime')('application/octect-stream')
12-var split = require('split-buffer')
13-
14-var route = require('./views')
15-
16-function file_input (onAdded) {
17- return h('label.btn', 'Upload file',
18- h('input', { type: 'file', hidden: true,
19- onchange: function (ev) {
20- var file = ev.target.files[0]
21- if (!file) return
22- var reader = new FileReader()
23- reader.onload = function () {
24- pull(
25- pull.values(split(new Buffer(reader.result), 64*1024)),
26- sbot.addblob(function (err, blob) {
27- if(err) return console.error(err)
28- onAdded({
29- link: blob,
30- name: file.name,
31- size: reader.result.length || reader.result.byteLength,
32- type: mime(file.name)
33- })
34- })
35- )
36- }
37- reader.readAsArrayBuffer(file)
38- }
39- }))
40-}
41-
42-module.exports = function (opts, fallback) {
43- var files = []
44- var filesById = {}
45-
46- var composer = h('div.composer')
47- var container = h('div.container')
48- if (opts.boostAuthor) {
49- var boostName = avatar.cachedName(opts.boostAuthor)
50- }
51- if (opts.boostContent) {
52- var textarea = h('textarea.compose')
53- var str = opts.boostContent
54- var lines = str.split("\n")
55- for(var i=0; i<lines.length; i++) {
56- lines[i] = "> " + lines[i]
57- }
58- var newContent = lines.join("\n")
59- var content = 'Boosting: ' + opts.boostKey + '\n\n' + newContent + ' - [' + boostName.textContent + ']('+ opts.boostAuthor + ')'
60- textarea.value = content
61- }
62-
63- else if (opts.mentions) {
64- var textarea = h('textarea.compose', opts.mentions)
65- }
66-
67- else if (opts.type == 'wiki')
68- var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a wiki (anyone can edit)'})
69- else if (opts.type == 'post')
70- var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a message (only you can edit)'})
71- else
72- var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a message (only you can edit)'}, fallback.messageText)
73-
74- var cancelBtn = h('button.btn', 'Cancel', {
75- onclick: function () {
76- var cancel
77- console.log(opts)
78-
79- if (opts.type == 'edit') {
80- cancel = document.getElementById('edit:' + opts.branch.substring(0,44))
81- var oldMessage = h('div.message__body', tools.markdown(fallback.messageText))
82- cancel.parentNode.replaceChild(oldMessage, cancel)
83- oldMessage.parentNode.appendChild(fallback.buttons)
84- } else if (opts.branch) {
85- //cancel reply composer
86- cancel = document.getElementById('re:' + opts.branch.substring(0,44))
87- cancel.parentNode.removeChild(cancel)
88- message = document.getElementById(opts.branch.substring(0,44))
89- message.appendChild(fallback.buttons)
90- } else {
91- // cancel generic composer
92- cancel = document.getElementById('composer')
93- cancel.parentNode.removeChild(cancel)
94- }
95- }
96-
97- })
98-
99- var initialButtons = h('span',
100- h('button.btn', 'Preview', {
101- onclick: function () {
102- if (textarea.value) {
103- var msg = {}
104-
105- msg.value = {
106- "author": id,
107- "content": opts
108- }
109-
110- msg.value.content.text = textarea.value
111- msg.value.content.mentions = mentions(textarea.value).map(
112- function (mention) {
113- var file = filesById[mention.link]
114- if (file) {
115- if (file.type) mention.type = file.type
116- if (file.size) mention.size = file.size
117- }
118- return mention
119- }
120- )
121-
122- if (opts.recps)
123- msg.value.private = true
124-
125- console.log(msg)
126- if (opts.type == 'post' || opts.type == 'wiki')
127- var header = tools.header(msg)
128- if (opts.type == 'update')
129- var header = tools.timestamp(msg, {edited: true})
130- var preview = h('div',
131- header,
132- h('div.message__content', tools.markdown(msg.value.content.text)),
133- h('button.btn', 'Publish', {
134- onclick: function () {
135- if (msg.value.content) {
136- sbot.publish(msg.value.content, function (err, msg) {
137- if(err) throw err
138- console.log('Published!', msg)
139- if (opts.type == 'edit') {
140- var message = document.getElementById(opts.branch.substring(0,44))
141- fallback.messageText = msg.value.content.text
142- var editBody = h('div.message__body',
143- tools.timestamp(msg, {edited: true}),
144- h('div', tools.markdown(msg.value.content.text))
145- )
146-
147- message.replaceChild(editBody, message.childNodes[message.childNodes.length - 1])
148- editBody.parentNode.appendChild(fallback.buttons)
149- } else {
150- if (opts.branch)
151- cancel = document.getElementById('re:' + opts.branch.substring(0,44))
152- else
153- cancel = document.getElementById('composer')
154- cancel.parentNode.removeChild(cancel)
155- }
156- })
157- }
158- }
159- }),
160- h('button.btn', 'Cancel', {
161- onclick: function () {
162- composer.replaceChild(container, composer.firstChild)
163- container.appendChild(textarea)
164- container.appendChild(initialButtons)
165- }
166- })
167- )
168- composer.replaceChild(preview, composer.firstChild)
169- }
170- }
171- }),
172- file_input(function (file) {
173- files.push(file)
174- filesById[file.link] = file
175- var embed = file.type.indexOf('image/') === 0 ? '!' : ''
176- textarea.value += embed + '['+file.name+']('+file.link+')'
177- }),
178- cancelBtn
179- )
180-
181- composer.appendChild(container)
182- container.appendChild(textarea)
183- container.appendChild(initialButtons)
184-
185- return composer
186-}
187-
index.jsView
@@ -1,81 +1,0 @@
1-var h = require('hyperscript')
2-var route = require('./views')
3-var avatar = require('./avatar')
4-
5-var compose = require('./compose')
6-
7-var id = require('./keys').id
8-
9-document.head.appendChild(h('style', require('./style.css.json')))
10-
11-var screen = h('div#screen')
12-
13-var search = h('input.search', {placeholder: 'Search'})
14-
15-var nav = h('div.navbar',
16- h('div.internal',
17- h('li', h('a', {href: '#' + id}, h('span.avatar--small', avatar.image(id)))),
18- h('li', h('a', {href: '#' + id}, avatar.name(id))),
19- h('li', h('a', 'New Post', {
20- onclick: function () {
21- if (document.getElementById('composer')) { return }
22- else {
23- var currentScreen = document.getElementById('screen')
24- var opts = {}
25- opts.type = 'post'
26- var composer = h('div.content#composer', h('div.message', compose(opts)))
27- if (currentScreen.firstChild.firstChild) {
28- currentScreen.firstChild.insertBefore(composer, currentScreen.firstChild.firstChild)
29- } else {
30- currentScreen.firstChild.appendChild(composer)
31- }
32- }
33- }
34- })),
35- h('li', h('a', 'New Wiki', {
36- onclick: function () {
37- if (document.getElementById('composer')) { return }
38- else {
39- var currentScreen = document.getElementById('screen')
40- var opts = {}
41- opts.type = 'wiki'
42- var composer = h('div.content#composer', h('div.message', compose(opts)))
43- if (currentScreen.firstChild.firstChild) {
44- currentScreen.firstChild.insertBefore(composer, currentScreen.firstChild.firstChild)
45- } else {
46- currentScreen.firstChild.appendChild(composer)
47- }
48- }
49- }
50- })),
51- h('li', h('a', {href: '#' }, 'All')),
52- h('li', h('a', {href: '#private' }, 'Private')),
53- h('li', h('a', {href: '#friends/' + id }, 'Friends')),
54- h('li', h('a', {href: '#wall/' + id }, 'Wall')),
55- h('li', h('a', {href: '#queue'}, 'Queue')),
56- h('li', h('a', {href: '#key' }, 'Key')),
57- h('li.right', h('a', {href: 'http://gitmx.com/#%NPNNvcnTMZUFZSWl/2Z4XX+YSdqsqOhyPacp+lgpQUw=.sha256'}, '?')),
58- h('form.search', {
59- onsubmit: function (e) {
60- if (search.value[0] == '#')
61- window.location.hash = '#' + search.value
62- else
63- window.location.hash = '?' + search.value
64- e.preventDefault()
65- }},
66- search
67- )
68- )
69-)
70-
71-document.body.appendChild(nav)
72-document.body.appendChild(screen)
73-route()
74-
75-window.onhashchange = function () {
76- var oldscreen = document.getElementById('screen')
77- var newscreen = h('div#screen')
78- oldscreen.parentNode.replaceChild(newscreen, oldscreen)
79- route()
80-}
81-
keys.jsView
@@ -1,6 +1,0 @@
1-
2-var config = require('./config')()
3-var ssbKeys = require('ssb-keys')
4-var path = require('path')
5-
6-module.exports = ssbKeys.loadOrCreateSync(path.join(config.caps.shs + '/secret'))
package-lock.jsonView
The diff is too large to show. Use a local git client to view these changes.
Old file size: 0 bytes
New file size: 276075 bytes
mvd-indexes.jsView
@@ -1,20 +1,0 @@
1-var Indexes = require('flumeview-query/indexes')
2-var pkg = require('./package.json')
3-exports.name = 'mvd-indexes'
4-exports.version = pkg.version
5-exports.manifest = {}
6-
7-exports.init = function (sbot, config) {
8-
9- var view =
10- sbot._flumeUse('query/mvd', Indexes(1, {
11- indexes: [
12- {key: 'chr', value: [['value', 'timestamp' ]]}
13- ]
14- }))
15-
16- var indexes = view.indexes()
17- sbot.query.add(indexes[0])
18-
19- return {}
20-}
public/favicon.ico
public/favicon.ico
public/favicon_io.zipView
@@ -1,0 +1,480 @@
1 +PK
2 +���N�Q�:NNapple-touch-icon.png�PNG
3 +
4 + IHDR��=�2 IDATx^�} xU����ιS�$�$�3���@�NV���A?�Z����Vm��i�U�������ƪu�g'*�0�2�Ly�g��Y' ���s�� c�S�g�}�^�=����wNp�5��ePb���J!������W���:;S�,�!q3�����)꙱�j��
5 +����#;� � Ct���p1&��� �}�d���>'��DNe�#�i���h�b���Mï~Zx�ڵ8�s�d|���CF0Xk�KM�x��������?��iI���O��a8�t�+��
6 +?�l^�:;2���)Q�u93]@�1�_�F�~��;�� �N(��d��7�����;��s��{l9K.� ���Sf.�j-�(��aEoc�Y��{��_�c���>������+�4�����g���"z{_V�إ9�5/ܹfKx^��(V8a���h�m�&��G0���6*�{������Ο펏��Ε��煲��E�5�"�{�ً2��5m9O�s�����,����~��@1ED��1&�Y�f?���@m�p\?!��Ά�8s1�h f0mf?mٽ�{���)ȼ�Ur�!*�R__��fE�~�{��g��it�������6�L,�Aϻ|΢�B��ґ���lX�p��������,�PM� 3<�Q^z���֞v>+�g?=9����@#��0����V|э0:��,��@'��5��標St������]tn|��2@_
7 +<V <X8������ydBL�'q%��Z|����ţ��?P�`F��%��PN�(_����y†,O�.v�pDs�����Fu6���2"�B����m���gGb�;��g~@D�X��]�����������M�3�v� ԣ��m�C
8 +����.� �F��a/��-������xJ��7�C���W"����Q�?i����Y=�k����.t\K@���C� ^���Cf�v�'2�D:�Dc����������4�?���V}���4�ًg�Pg�g=Ǝ�O`(�w[m�E���r=?ڎ�̿3� 6vi�����z��jK� z���m��<aٽ���y���4V��@��2{in�_��,�2����E ��{:[(��U�}��}Tk�a���m��ُϘ�v�00���1ԧ`����t@W!�y��-"�e.���q� a�Rjֲ�5�٥��>��p� `x�y��0��p~�]ǝ��³t�Y P���a��� J�sT�|h9�o�W���,�_�0P�9�h�~BTO�hd�{��/y��ygfK@�>�(�%7�Q�aj�����󺁠� �ON�6���l;c3��j���w��h�쟳8�A@��gkɑqmm�&�h���v��Yp��� <����/v8�)�v�����g��%?���M��)A�C�6�T��˺����g�uk@/9/٥"7!)X�0sH=ԤZ���grΒ�_&�/' ��Y>%��i��y�;;��9�gL#�o(% ���Y8��ծ��.�|��VkSP��ig�)�|����4�8��~ُ^8��v}F@��X� uvт��>L��!,}�ŒtC���n���73����w��x�d��Nȼ����f���_�+~��� 3"\:��@��w69\�ѥ���C/�\LL�V�Xݽ,�����d� Ү���P|���U��i�]��c��3�����߻���g�uK@˩;!2V��cB+�xU���Y���8�=5=1��x� �Y��̋ sK�q�⬇8
9 +�=�UA��l~�5G� �Y"��qr�/��^:�䙮�����D��XMDL���¼�{�7�� �� W@�����Rnn�����5�����NK@K`DΒ�����n�P�>�����dvQ>LKő]V�e����[=�Ym(�-����sg��@�� ؘ�����󎺷 �]��+V�B�9K�J�z�����1OVmL��rWo�_���ڑoo��y��k�18ճ��W�=֝0f�A���]X��H3�aYYm�V�����Y��͡9e��+ski�+fE��#��,�q9��m��4h���w�� ��@��k��FG%&�<�%i��4��i�.���F� ��������E�C�?��Z}�W-�_��$����2���dɌw
10 +sW_eկ�u1qn��H�[w�<:W���7~��b=͚-@˚�.��tܧA���I��^��2]���ָ ���G��q�<+��HƦ�g�]x�����1����Ą�ox"<��~�n�R
11 +�P�����4Ț����>߿Y[@(eF��vզ J���t��ɗ�Kk7rQ����z�s�cSG���$Ѕ�s$~h��Z���p��������J�F�� �1㏚�����No�"��%DM�vDN�4\J�e�09p����/�S�a��z��Ș�* t�J���� ?���.ihh�&�"�@$v[����wn��F�\��t:�v����Ϳ�C�� ����_g��Od|OwГ9-�դ���_-�F�M̢.��?cE4G��d /+cqa�9{�6;u� �c'�/'M�%�2:@e)�u`������6��!� �o�N
12 +�������y��ʟ6�|~��e���ck�!u0 �].����rTʸ�/��~O�Z8�]w�A��2�F��뺚-�3gq��ۛ���VV*����j'��>�����q��|��Zv�I����f^�;{nA�� ���󣹥m�`��6��M׵f�P�+��R�wk��6l�8����q=��_��+ǿsԸ��c��V+yȯ�Є�O��/���[����j�S�zXm.4�ܬ��@� �m-��\��V��JIJI���6o�7Z[Z��l�s
13 +t2UB+@�� ����6�V]w�e�� p2�+�-X�;˝�d�T(�V�2 ~O��n8]���4�+��u����1[/���ڼ;|��� �k �M����K=Y�0X,4��'���x""#L5��u����QZSv��=6v����?�:+(���R��b�+�͍:�3+��=rL������`��jj�z��u��:66��v'���YP]��.,ZP�����>��ڿ{���|�W�z^~=v�u�� ;�MP�rZ���������'�}����M��o�}.9P�AR�]��f�CYm��m�=�.gɌ���;b;� � ����ty�h��Eө�d�oskk+j�k�l=��D�D#**j�*�p��R��̤m�� 3���(oe���3��~z�j�S�z���6O��#ܱ��ņå�P.�jm�������+��(�J���y� �_o�o@S�����E��Ǐ4h�f�r����ߺf^3���A�D(�2����J��8i:�3�����ʼB�GӴ2��=��o�;|xzI��^�����'|�� h���K���|O�=Gz�3ӜZ���&4:̃A�Ċ@m`!r�2�60�5���/��<W��$�Ho2�UW[7���Hs��,z�'҃ȨH����q��v~fqgk�zi�n����Mn��U�w��������z��҆��f477����*�"jc�}��[�?������It���/�ɦ��n����������Z<u���{v,�n+���vC[������N�� =+5-Cw�/�J ����r��1Q�qш�j��&g�� ��j��3�8��\ A�4�3h-���6_��q�h-� H�y��g�MEODF���Y�y�r�Gִt���tJՙ ��&����?ڰ�؝[_��:���̇� � ?���r0��J�������j�f �ht_'iꓱQ���AtL<�p���]�}}L����]���6��[��Є��F464��S��JӴ�%&'�z<��@$aA��x����{�m���K2f3k�� ���c���W�CE J��՟�L!�Z�q�C��^��b��Һ���BҪ,r���p#uh*�'��쑏�?e��e���������?4y ���
14 +�㮅������/����O�<~��^s�_��h�����lw���gzNA�<�hq_";���++*C�d�:?(�Ƀ ������ɝ��E.���Vע�� u !˧�ex<���@�䜑� 0~�]]\`���������|�}g�I��b\�<��_'P��M@�d��H�q_'#���*�� ������>ČZ���ש��w����]~�+�l��������`~¯����~As 2�b�%��D�c��-���E�zQƷ������>%م������ p�`7l�Ps� Z�߲8�� ��YU^���JH�J8�☉O�7�X?߭�Y��|��Cy�<�yƼՂg=}�0���
15 +Ge�t3//�-�c5f_oס�9R���QЙݝ}��p��r�m�^ �n��^1���6�:�4QC*˫PW]�烤�R�211�!�q>��M�<{|��&�dF,A����)���(@��_-�;'�9�~<�Zͩ���`wjy)r詮��Y/jŸ��L��EP� ��|x���.E}]}�w쨨�Otԭ����e�b�u�a�.�At��� ��-�_�O;���OWS�Y4�: �<�h�#�����Hcp,���uR�;WV��l�i��=n�� �0k�����im�V(>u�;�캚z�,7��o����~Z|`��޼���L*8cc/�t�>��`�}.w����7���uUv���n��k��֣��o�F�/u����X�|c�c6��(^&'�$��~*Eg>���L�^�9)zƧ��hO���m�6bG�f�-5�N���XWW��;���,����4e���+ ʎ�tpj�[���,b���fu��ܒ�O�T� ��]D �љ�4�oQvsK�Ī�*��N"`=~�R$ 0�G�H�������r��^C���g�>ŎC�N)P�{��<XzUU�y�Q���Ê�����'�nϟ#kF�R��д+Aڍ�d3@�ћ��: vgYo�P%AL�ᬔ���O�����!`��ؗ'�3!�`����ù#2�r˂`z򔁏����f���I5OQ��Q�� u5��)�NKX�3i�i�q莯�b�F&�Hp��D�]��֯��� G��N�p����_rO�K�(�,��a��a��~Y�.Ej���Kck����SJ��.,q�,=���MU/��QQQ�����X�\O@����a�vKX}q�еD4=�,E�3a��n���|ֵ��&0���X��MS�>���ֲK��)CcChk���A f�L�������Y�Hת�������D44�%�h���g���* _>�:D�w
16 +����-4����$;~�ν�,�l�f�l�*OLJ<�-*�0b�%�Ǘ���d8v�k�=�D'���v��^���&�3� ��v��K�X�hh��6�)���1�2�� �U�n-��`�� p�
17 +���m<���뭭�So1��>?��� �i�I�Q�g���EDE`Ҕ��K�?�
18 +����sҸb���Fi��y( �k��z�ز3$��� ?ì�¯�]ظvk(�����4�=@�C�=m4-p$)F �9��������+�� ���C��n)�<�f&�Y���aO�g�T�#y��u�>���li��{P_S�3F6�A���d��O�Td0�k��}蕼 �ua< �/��IKL��f�MLK�1�0 ��N�aЁ�2��c��&M�h�H�W�5�b�`T�$E�@�Q�T�=��q�� �:����N}�� �3�IPM����e�L+��'ſm+^��pӠ��{!�,��� [� �
19 +� !'���RK�? D2���q(���!�M��d:��c������r�.ߊ��C!�e�>��������T��ÉI����q�;V�:Nb�c��5�d�ĸ$k��M��6�0͉(;`�+*�ȱ#�x��.�n�r6� ��u�&�wsw�6l9p��5(� �+U`ώ�A��!?l�y��%w���A=�$�|��d,$hw�V���:tȌ��jb�7��2�V����S�b�ȋ�t�~�ݰ�=�=B��(���m�6���~c?��ޢ�_ڿ���y�seުix��`�VS]�~�ۅ)�ci"
20 +���j� F_����� -�X�子T�N�H�ޮ���2�1�JP�M�e���,B ���H9lg[�L�GCJ�~ ���a>h���^�1ȥk�<$���� �LuU���urj2ƌ�/����t-����;:�d������Mۃ��f��߾rai�
21 +�Vr��x�r@
22 +.�� � ��O �w׋ օ��Ԟ$�0c���*�:s�HL���X&M�����3�����B����͚�s���~��y�W׬)8��
23 +�=]�iI������%��@�v�|7,_�~S(�w��=�pI�L(H}�����$�u�S�iu7n�ؐ�����>�2 �fPU�o~�O*G�<d��<\�]����S�37am�j�~CAePvh�
24 +qV�� �Vo|/�.K�5��u�������]0#E#}�%*o��'��f2��)B�(A�V1ѝ�M��a#�GЗ�����%����3�r�=5�Y�}k��*|љ2�dˆ�#3?Z���6]��7�f�O�v��� !/��(y��ڮzi^��P�
25 +�d���z��*\�`n%2�Q��)�q�����ܒ$��pW ME���3v�vhN�r6F��~�;���Û���F��i)�`:���l�i�� jf�0��[����AIt�� FE����f{�E\���5]�H���}�6�-�|Y���]��C�Y���O��]���r�2�K?�ah��c�gM����0t��3Z����iSg��5{��١�8X���2l�2a��]�8l�²�Z)u���z, z�s�y�Q�]P2�g��UK�G�hܣmR���]@
26 +1� � �M���VI���
27 +�1h�Z; P���6, ��1v�?]�H���!SF��%,:��l�0�{�nTW�Xzz;�R�˔��sEG�'�GEz�4&G�6�W1Ѥ`�›�+� UZ���̳���ڎQ �zR�t��$�jmE]�l��d�K�9���1�J����)��1t�08OA;��<��4�b��&���ƍ111��'&�`F@<��J�af��*�E��6��h��Z�����r�^FD�L�vٰ1��9v$"�#OK*�D�﷘6��Z|�y�m�� J��BGV�U
28 +w-�[]h����~�pC_2lX3~&�p�NF�I�W��t$Iu0��C_��(�ٹ�v�Kg���%�Ԙ��i{��𱖆��Ю�Ȋ�t�jj�nin�W���T� ���L� 6��d;pS�/AT��r��W� 2)ǂi�:3|����"�wm�I�n�a�܂� �x�����^[[kV�
29 +��E��6< ��3j�]�@��h��m�֍[m{E�L��vinf��5_ӣ/���=O\//,�6)���n�H�1�:�9̱�˯��u;r`�����c�� !�/�[���:l�t��1�Ӣ����q���`���5o�)Qg�������Lp��s&��z�+4��k�̝ڮ'��D�c�1tx:��̊V�$ Nѥ�٫�&@NJN�l�ã\͌w�ǖ���f�>j���8�K=N�s@� լ{i&�OC� �P����C�M��P�$B}�v_���n��pi�#v'����`~�`���K�~��GXY���-5��۾D�߃`�Mv������6�4��>f��w�0�K*�8G�o�����8.�ppf�ǡ
30 +�޾��/���'%%I�[�f�kX VO{��ׇ#����t{-�[�����٠�I>��f��}�](9�Ƀ�0d�H�M.����,\zC�"1:�$�qt�(� ���T�X�Cu���]��c������ܺ�$a���nWsb��'�x�b��~O��`��y��>AzΒ���_��LI��J)6j�k����:+� ��u쨘H�7Q1�<7� �DR�a�������毒� �J7����S�I���o��x��~CaV��%�U6A��G�K����3�3��l�84�h;+^� -޶͕���b���t_���i�RM�ڊ������f|� Oc���G$�s{+?Ö�2t
31 +�K�>� IDAT۽�� �f��5��Y�ֆCΡ�aЦi.!�Q �;�}+��T�_�4�ֶFW7�3o�dղ��Q5d���x����D ��.-����n� �դN���i5x�Y3<�&z�07}�o�)�SwrSo��S��Uc��׭\T����u�6�g-�~�Cs� ��v&���� ��źz�[ݰ"��`���.�F�②��R�l��a�y���ig-]�H���#��r�Ni�ўb���OX�Cعm��Q�[,]����N��m@�d.&�.��h�:�j�i�C��U��Ğ?5ڥ5æ)� ƕ�n-e�ӆ��u��b^�,�҉W!6¶#��k�*�fǿ��۫Ic%���.���O���ֆՍ�ѫ|_^������WO�������Fj�u6�36���P�y�� �=�^��aA�Hh�SK�W�� C���#���� @����ȷq"�r�`�m3�؞�������������E�u��Z��&��?�J徔�&�,���]��y#�-��min��yOT����3",E�2�}�cS��
32 +ʪ����+O�/s�k��-�l5�VM�mد.Y�d��V}�}��sg>B��[>�Q�W��_\�N�TH��%c� F�lM�0Dv3a�����JO��K_�"���M���4ض�,��+6���f��=h?ww��Ϭ�b���\X&��6[��S�q�FR�3pa?�����W�� Z9���)Q����h���])L[nK �Bvƈwq丑!�EF��q��+�qM,�� �>���W��Oz�|�N�F����� ����~�>��O[5�X�Ҵ�� ϊ�0�&[�J�D�v C�5R�Ȁ���ܵ�{�i��[���h�� 0���3�箵��e�k��Nz
33 +��Փ��� ����P�ب�D
34 +k�tG���W��
35 +*_��i
36 +�??�+���?�v�*����8��Xh�M�i"lnk���(���';xپؿ{� �|�]Z\P^bw�]��)�����c�}�S����5���x���As
37 +��4���������7�/�(ga��D�$4���@n��m��YK}�`��Ƙ0y<��@0�v�n\N����� ��!����4LJ;7�F�]�\��?EEÁ��-��o��O+�����9�0�K�O���������\Vs��Y������Q����~�趟�;�����u˂��4뉌�t� p���Q@-�uuu�#º.\tj٩�f ���]������ً�����P<�R�bؠ�&���z:k6�܎�>�_��(5]�yI��37��|�{갵����ӝ�~?���l���կ���2�;o�7�L4L1>��y�LV��q
38 +� w��7&�������tR�g-�0c'�1KdX�����:"#haw��N�a�J��k����EŘ�~>F���d;o�����/�����O{���i�wi�1ϏD�� ��,�q��h�t�����h����A*�r�}��_�[|a�ݧ7�qs����J� �B�9�2���-khh��A��O8��L )�c� )y����h�#�i�ڦ*����>��wꈞ����0�ظ}���f�
39 +�χMn�e�s�]{���7i��BX�=�b��A�hR!1� ��p��sO
40 +@�d���X۵{}-���
41 +��͛��TE�Q�5�4�f���eԸ��=�C�cڨ������>�]�}2ӛ%���(��ΜD�^��?A��ʯ����(�Sf���`p2��\��7�~���xyi�j�]=���So���;��3��u}y���^�kw����P�*���[SzT^Z>��jү"�k7U\�h�.`G��]Z_�B��W
42 +e5{�ा0�8֬mng΁ޗ_��q�:� 2�D�[>�jY�D�-�,�{�V��\�W"8:q����yiO�z��w�V6�?C��mm��� ��~)+/u��9"�bW����e�(�I��z�$O�ލd��gJ���
43 +�����QɊ���Ic�.��~�ۖV��{Ĵk���~lݸ u�&�ȨH$&�MM�Y; ��-�������u�v��L��;5����f�T���t#������l��^2/-�ڟ�mw������g� Hd��1�H�<���X^�vJ\�,ż��33Z���M,3�|�1)}ʼ_���L���JK�-�&jǐ!Cl�u���`!�{� -�z��q�8g�߹��X ���n����%���O�f�e:I{��v�}�[�NS�S!9r�A<�I1)���k�z&x�m�o�Au�aT4FS[���sq;"�1�ˈ� :��eIF��7�ө|�ՕզM�NK�ҷ*Œ6E�t���W�����g�}sv���MK�Ou*�;�T�cGu-߼4����j/��z��p��>��$�c� fJ~����Caֱ�P�3c� �f�}�_��L��� ��J�w-.>���{hŒń�~�~�Rݚ�VN���Y3g褽M +�Z+X�xin�㡂Y*�Jm�9������z�L��t;b��Mj~��+��a��c�K������DVM6 �ﰛ�/D���^���/ݻV�B�_�q���3���,�Ad�kȋo�p_q�?+� ��ϤE�4��6Oc��.f֫�j4��_D�R�96.�����r(<w�L3f����P��Y�P��=+�s�u� �Q��*�ٌ��`�g|m�g��ח[��]'~�-Ujc=�,@�z������r��Y�2�6��3G�
44 +_����ݾ-���%�ib�=~�����_}F&�ǔ�3�l�����cO�=]��z$>�� -�I���)�l:�d�%b{�<�**Y�f����E JC��:n�AH�8ҵЃQ�3^�:ko&&dΒ�y�t�G��b457���DŽ04��<��K<Y����'\ ��K���8VB=�Ji��~��F�(QBktL������a�Q�-J�*0�3{� ��%���ڏ+��Ռ��<��) � ��C\˄��~l�+�f?�1As�)"�2�Qzh��cOf�1q}�72�{��m��� �]�5��?�EhxE��,�M�Y��tI�fq�q� �_N��#=S`p���k��g{��]���3���C<�g��'*G��r�a�R�k؈�A����U;v;����<����ț�>�m����ػ3p��� ��U����O)�@�eA7̜��Klж5Q=���n:�T��-�t��M\�S�M��$�Ͳ��W�
45 +� ^�XY^��[wY��c�+�~��,��yJz��� ��'����������֗[̲s�K��d���SK<���8��s*2Z�\��ջL�e_�I:ǭ��7�J%V:���������PӲ���tv~� W���P��D �KK`�0��i�KO�p*�S��Z"���iX�Q�fD����6ԵTC2ͫ�9l���ls�1���W?Ui�/��rz�sJ:����n�o4�B�6m�� �`�JW,;8�o�m�� 5�,��ȶ�Q�$�Jׄ�LZ���K�D��^���d�=d�b���|���d�S�sg]���
46 +J��bz���{���JCU�T�7}Ec��@�Vr3ޔi��ڱ��Nt���N�˜��
47 +����x��A9K�~�vT����f�x��²���V�8�Vaʽ)Qq���n��'5^R���B�tA��q�-:t� �b��U����fw�Z<���{VB�l�D�ZX�k�˻U���N��9�_b�&�$fZv�v��!GW��X�������Ih�ے�$�!��ޡ��6��(ZPb��!ы }���g��t��I'����@b5����؋Ce���J���+�I�B����r�d^N�W����A|��y%Aqg榟� ѱ�+$$&�Iv#��卝���N{�P���rv���U�J���b�Sз����Ӟ`��QOtd����կ�W0�Y"�i��EFF�sDZ���v銕�ig�|�h �����2��j��LzY>ɛ�EErl;%mN;ZNB����`�1��٤�%����3T�]tO�lMi/ة ��#nj8v����k�5��b^i��~�����r�̈���k���X&6�����"��f{э����4)'��:��d]�`���ɻ}i�Q�B6�^���dju���3_���'M�دe/B�0O�}���l���D���#�~�ض�Ư)ݼh�DE�Ot1��QrNi7+~�0��/����t�^X������3b�n�bҴ/���}����2�T��Jh���'���j2F��:j����$R�FHҲ�+��m�v�{��SJJJ�F�����>�{�����Z��j���ִh�s;".� �����������-�3����E�RYs^NLC��`�ɡL$^�T3M�x�� ��yM�q᷶���:eH�K�I .�BJ)��$�F@��s��Q #�j�/�;�G��d��܅96"�P���y%�9�j��u Wu{��g����}�����r�N�Z��ڪ X�sh�Nd5N��}>?���‹a��'k�_��C��{v�Ca��=�û�naR
48 +����r�՗�������$���� �7��M�G;m��ɈK8>y��V]U���e���z���� Kà�A���l_���o): <xpX���� s���ր��t�X�_j�+@=pZ� z���|Y��C�1z��~��,~)������:wk� 篋�u�{?� ݪEDD������:*�=U8�x�� h �[�y1��a����^�H�����q����7k����7�o�~. �(B�e' N�ȱ#M7~8�%s�]�A�D���H��h��7* �����7�����$�R��gLVh�$�vZ;��7��>Wё�j+�`�|NJ�`�:��t���F J5U�Ꚑ��'����3�VŜ�[]�x���:�^x�Y���v��S �<t𐭼�a��"}xz�m�lUTc�֝�ԟP�*V��FCv�~�"3)r�X�h9��0���V*��O�|��w��~���s^0�t���SΚ ��j�!�IH�Ǹ��ª�
49 +"�� h���&N�������������7%%%�r�M �G%Ƌ����d{T;}�8c�헡$�~.V`4556��j��m>`�B�Y�OD���X����h�=ܤ> 
50 +B6#;���5"RC�R��Z��
51 +"��a��WӰ�����xH;�g�d�M)6c��t�5 �d�R\�D;|�n��Onji^jGu7i�I��&���C&ǣ��<���}ڥ%�_��VI��OLI�N�+r,4�Հ���H �Yj��xR+��n��
52 +J�5l\v�FK%����̵2m�V��� �����ul���W?�� G���w$G'z�/�Vc JL��0�������}6�Yͻ�K�)�j�8��ogj�3��\T*��d3�+��uE7�y�G��4|�t��J��o����������ǜN�.pC�$���6��<X���=WχvI����F�V/Y�S/��^�}|��Jl��lC҇�e9Bm�{KM5)0��D����~'��ع���ř�b�'�7'
53 +���J�n]����V�yY �gꠕY�\�O�+��Z /L~�e�>�M*�u��)&��
54 + �@f)���ՋJ��o��t�C�%�"=�i=���v�P*�ż5��zGr���4�J��&��>{ �@��O���d�Ȱ^�x�8o�y!�)6��oDss�fn�wV.:�bH�y�ihY��ӆ3�� �����A�c�a�����޷)��EyC 4��V��7��}N�5��s�Ɛ�5����u)�v~�y! ��c�O����U>C]S��@q��s�ihY�w�uG�JN�(5��h��Z�_���IX�yi�뤽F����|' �}��0@��8fh�>Xv{>�����n�q�{ XG0�An/}N;@�A�ܚ�7t�x����Ew�2�I��f�;Q*�8X��6Q76� u�Bf��^S����W{��{y�s>'�����'>��2.$9% c'��!ydRC[ji��Pԍ�����\'kQ̹���,����Ev��8�ِ�v�HLw�0���^
55 +^�&j�d�ۭ��x�$q�dz IO��q��z��qX�T��0�nץw�,��G�<�wt�D���F��`��8�c�����f�H�iΙq�����ʄQHN αb�&!���u:��2$e34���Ջ�� o<l�����Ԅ��k�_�p����yq�؊z Ł��7}�� P:M�P&�<���lo�d�%A��!&&��t���������z���o�����d@� ���q�w�q �X!Hv�ښZ44X�>:6�4߉�j�H��B�r<���ۃ��a3���Z� d�E#f �L���$'���� �Kg�&���V�r�1������� �2����cٽ�jV9c=���L贘��% �7PR�$Fڪ�=W�:��C�5�H�g��-��K���s'#""���!��pqX59S�{)�$�G-�h )Ũ�W���i��٤Pf3 �$h�x�_�;^�]���g����9 3.$��`�5d;���������)Xٍ:���^�����fZ��h5No�%�f�ؑ�:8�!�������ΔNu#!�Y=��}�/�{�Cr�z���z�]0w����*ȋ�j ��!�þ�uH
56 +��{Q~���e5���K�#�.['*�Oٵ�e��E�<���!4b|���'����W�3%��mM��3w�PH&�U���)���kP ����l1q1��
57 +O��i��lYh���&5-5h���Z�ղ�ܒ�3З?6%j�3�WLts�`�����Ç9��s��dT�m7���Z���[�X͋42Ig��L�^~�� ���e�,s�dX�p�CǬ������ם���� 3�C`S&e1� ^�?|��� H�z����;;,՝�uUզ
58 +b�^y�
59 +e���&&'�Q���L2R$P<�VMx?�� {�e�s��6-)�]�wF�����W]h�"Lq ���Y�džzj�=kߖ���{���g�(��KL`�|*?����9�4��4`bFlmi�ܱ�������!}* j�K�b�>KJi �ǽ*%e0�iLʯbo'%+�mق⿞���)ȜKD���@˼�����w�=�y۹���1��Ⱥr��C͟�p���Ĭ��ESS�Y������?�亓�Xab�K���Z�y.X;sw��Ǵy�x['¶ohQd|#-}��(C�p+����z,ZxL�5������Ph�(�MWXn-f� �e�;�毖��c��y�H>�����������'��iu'm$�O�z���ػk/�v�H&H}p�W���I1��Y�y.�G�� N" ھ�g&47JB<X=SX��W8����~���.:7>��>�U�!�dƧ��m�敬��Ey��i�Xf�ۛj�ԉ&�����\�哭r0�\�d�0�k�
60 +J���-ڬ� �u�s�8WMb�������F�K�����1����X�ۇ�;�\�q�pm���� ��aQ`��ڬ�-�)�u���K�J�\��5h��Y�?yʤ���S�r�������rQi��9�5S0�㏊�tiZ<�E~G]�V�Ц7��3oGP����Ȇ>7+�e�E�kcƿ]�v�� ��{7ܩ���%���^�h%�# K�b3���~խ��1W)V���R��O@KY�����4Q����\4�\���KE�/��J`7d^�kn^\UYu�U_�>(i���N�Z;� GI�ݲў�!�S���5��O?l�R �{�tv��hg|���d����n7��b���5�F�)����wi�U�1�&;:�,M8g<�x�4�$nE�gl0ʺ4Mksz����w�{"�yFZ,��Wĥ
61 +��� ���?��6U��hAi�ނ�O�<����D�Ti?��N)�v��M��8�Nד�����۹�؏Ï��Uq�qO�� $��^�讂�r�XwK�c�E��i�OsN�༒� :�\!����r{�;�y8�ܽpۥ� ٝ,7��v*��;CDu�������r����������4gS�{��!��=��%װ�^�7Y�p�[?�o=��*�w�>ċ�ϒT8���d�� �w�+y���6� �t� %� �IDATSRzB�=H���dG��R}���L^��j3�Ϫ�V���� >�{���$� K���x�u�=H<�`�MD�f���t]�����W!E;�~�ɤz�:�k�sۮ�r�m��f鸮�#�3�6����0��7��M�9O̘ ��g�P#(�
62 +�'q�Ap� �0Km�UFNWQ�'TR�d==�P�*�����ky�7���/c�]��d�P(�"{Qy��644�kjj4+���� I 3a4Ĥw�ZgXj��*�۽ϖ[�s��!��m磔�%>6�u��`�dI�ہqНo)����{t�~�Y.�
63 +l|�5�6���`{�]&���q��K���!6t�+(���W&��o��mH��' c-�����}FU������u��6&9�!e?3-���y�r댙^���n�d�K��Pi�.��s��Ø c�+������ݟ�1���i��;�5C� !ݡϰ��Y��hP0~�ئ?������",t��f/ʼ[��8@�H5�w�ϟ[t���C�� �ӏ�$��^����CÞ ����U�U8Tv�AL�1��_m>�m�F�p:t�� � ��s���խ���7`%�@ ��c����֓�a] ��&<���Z5�;���;��N�i����+q�#��Z��qP�]���{v�Ac]cPf�#se�l��n����4��i�]�.�[������R�Z��F�2!�@��$�kPx�U"eflR
64 +7-_��,�۽]|���p:^%��`ފY�/“�5��󣹱 ��Uf��*U��x����ja�Q<9 3�!��d�,��d=�d�����xJ_v�@�C���s��v�n0sym�b�)37� M[
65 +�a�z��t#�"���AI 濃I�2S�Z��}\,s�9����,牉������s޲pj�_�|����+��������]��x@g/̈pi�Ͷ����i���Q09�k�Rlij��f@_hM���0hP"�#��@��4�=s�#�P\�B���Ԃ��:4�7�9�}m�8��ӡ�iimɷz���y.+&��0㎎̓���:&*Y*ޖ֡El��/�eq! ���:Y�7�kRRy�Ŝ ?�-/�/���mN���Η�%�#Wro�J��G�.;���P��0���Zͻ����(��ř�J/�`L^�W�� ����c�\lB�(�`~�0�X�>�l�>��|hs��Y�Y��w����? �m���iq.�{� � ��� ��d_����!6���@�0nZ�`͟��`�%e]���� :`'K SG zO�w�s�h�.z!o��g�>h�P8}*��]��\(E��D{���Zq��`��mOȸM��3�Yv���f32/j@_^�ս*@��Gݭ- ,u֔}���{l�H�^�1���.#��BDB�3�(a�:��$�]�����`5G��� ��0!3�@�ʼnw��%�X}�p�ڀ�R�����b�2������Ґ����r�w��{22��_�/��zY�HOrdr���Vg�S ���I��5m%��mYu��^+�Z����@w
66 +C\�q�h}����R@�ޮ��O�3o�eH]Β���J��̴&�ߴ>1���� �eP]��G�6M����#��<�l�:��^����b��@-!�Y2#ƫ��n�r�}�͇Z����s 2����[ZZZ���* �R�F�e����v���l<�>.!�)�4im&�xq���;�p�t�$��p� �������d�[�5U���6� �J�d���cz�ު�;�Q�U�g�..?l�����@��I�o�ئ��[��֕X�=�-p"&u*>3�əY���1W)V�-�-������ ��p�\���q�0�u��I��v� 5U�?Y���i,�ɌsHi�e'��6V��ݻ�������=:LR�[�y?H*in�qx��E�><Bh���e�.��5V���f�@�݄�@O�^TT���۩} oU�(��'�e#�)�x�H���.-�d�ķ�+����@[!���l�9e=G�YugƲ���7w����˭k�0�K�R���� �4�����>1 %n��Dh&�t��}����i:C�'�6g.ke�>���G/�s9�A$֪G�:[�����g�m�ZyP�d������?-2.�]�UV�)V��,�D
67 +i�_ ͳ��V{l�TC��������޷+B�� ��nT#��EEĭ$�A����Y)u�5�����h�Cӥ|qP�4 �$��[>����J>}�>�J��Kf�&��W0.��P��<����MOL�p8�#PJ���d���>�iΉ�n����X�\[M�E���!z/�;��
68 +3�|�3W���4X;�����>�`%�CЬ�ХVñߟQx�Zٍ����<ߡi� �U]�U���SLE�⌇z�
69 +��~�����%��i����k�K��9�?�����Xɠ?�: ���dW��d�T�0�k�/X�F���Z�q��H��AwX�5F�����th� myoq��g��ֶ�=�����efhD/I��`���w����`)p�y�U�@[I����?Cw��#͵��
70 +W�~�k���gL&��Š����-������� 3�]��e�z0���h�_���c�J�V|�� <e��AƐ����ڞ�+������$�ًf.�5���@B���;���돪��QԨ�@#,v�Êq]wܼ'ZN|�O�H$��?��O5k7/{pUM7Ь���uh/�8���Xa������_}&��z��a��)T�z�c ���������9Kf��otq��b�?*�+y��~7d g��`�a|~���fn���� =P���³4��0] BLOk�sد �U���15-Lb�fЖ"��a���_ה�tϺ'���g�T�:;��/��n�z��P_���7�4����,��=����"`418�0�X����L�d��L�c"�?&V�������/X#řBηZ�����#%�}����̜�� M�FX�����x��{ ?��EY�I�"�G1��0���))���ǧ%i���]c5�\��/,�-�,�!�N1��_(��|bW����de��4v��>����!i]n ���.�^{�*�yNA�%D�/�������;*�.������qZ��Tf����be��̈D2�Q9T�VU{"���4�~t(C��ؔ(��'��[�+�R�^��揁�3g���5]{�V�h����--4���x�3��-���Y8�r�t���kA�xٛQ���6��Ӝ�̻I�ψ).@��*oYn�s'�(B���C]?�(�����C�[z�U��.�_"�1�×���5�4~��3=���5��E J���o�>�^a���Ǻu�bf|���k���_6�Z�����ZFΒ���� ��N�LT�?�[�VO2�XOg��2:�=LK��`��!�t�?a�k�ܲ6D�p�~���WÚ6�7h��^`Gт�^���������g��IEND�B`�PK
71 +���N������favicon-32x32.png�PNG
72 +
73 + IHDR szz��IDATXG�W{p�����mv��y�汐b�`HxC6i��ԙ���ɴSi��3&P�u|�)�I�5�a�V��2�N��ڊ�A 
74 +e !�݄<w7�d���{:��Ĕ�I����}��{�����s�0�U7�w2���"Q��2A�o��u7�kk�o�l(�AB\s���v�����㶺� &a��Z�FhRn!O3��h/K���J@T�[�Rk ��a�;E��8��Wk[Z绹�3l�s���7����=:"_�P�_�9�lI�X��#�?%KiN0o����pܥ�L���HJh"�>"<g��+�M��d�J�īw4�� ����!�ă�p�@0���z��IM�܄!�� \�J��b�H�C00fv:�0�r�GsP� Ҷ��=��o���]�j& )�)�%�`6�!!�C���1����CӴs�hWNv�"����k�~��gJң1Z�Jm���PuC�!*���`P�����bF���H�L�⊇P�� ���{A����p8��t}�@�-��,{@i$ޝzx�g��`T�DqL��Z~���<3[֖��%�b���^7�#]��af�8�~�`�S鮌z�Ͷ�@���fcm�wfe���Ni�^���oONҊ6���Մ 7��]�h�)_���8������ؤi��a�����fO����3'z=^��b�z���Ot9@ņ��=]��E�[��_Tk���X8���ߗbPuC��Lڏ�呾��k���)sa&�,5�ˮ�� ���u����:$mI6�U����rM�uS�op�֖��ĢQ�#݁��eH0'̅ኺ8{�,�#8����"�qyˁ=-�����S@<#e�400�#z�)���˗ -3m Ss�`��;���YAD":N;i�jV��8�w��sӝ';����������?7��X���� @��\X�<o�$�2 �&w��g�ǻ>�"K���=`�?t����24���ƕ`�0�j�m~��Ν�����AĢ1�:S�bu�b�U���Xf� ���#Sq8�-]�� ��x� ��1��O�훋Eh�|'��=�u�ʮ{8/1ۑ���qH��/����At�%q�%�P�=LZNu���`�@�ec��Ƴ���S�����9�43\�6�ͮ��ݞ_� Uu����$��n�i�UQ�N�X�\x �R�B8���A�@LF�N�8}���%���A����0�O�#%%y,����HF�����w�:���vU,�8�K��>Y�H����a��H5��JT�Z{�N{>�xz�%��������<C�WRPU��y�����YO�g?Al-��j�e�ͻ<Usj������G�=k� `������z���o۟(�*��C����+fPs`<4��d��,��t��)#�s���D,��[�Q��z� ��^c$o(/��d��������xW�Q�T�V�%�Vv�kXJ�9T<�2��t� `)���z�ǣ�ۖ�\� W���um�9�25�HU��p�[N�����@�⒏��0'�Oԗ~K�ɳ��:v~�=�����u��_��>=�ٌ���7.2��C�8ӡ��/��y���;VT@3��>�;<O��SMME�Jɉ�Oտ,I�݊� E���3�B���X-�#� 3�@m��4`���l/�~��ξ���h4Z�j�J�ʦl48���N���#95�Ѐ�f5�W��0��8�
75 +�� ]Lx���y���P�P&O�\����^�\�������^ nz�P H5")�ά�����A��N���ܼT6l\0)q�Nc:���&+ꋊW��٬�Ӈ�ϻ�����z����{/��7�p��E.�9� ���� ��џZmV*,Z�Dk�Tl5~��>x�<�fe����%��>o7�4=�>�w;Si�so'M4���7�n�w���?��Ū�ԝA�\M���a#��SR�MJ�����{&l(>����j���*�]�d�:*��Hc�n�����s ��M���윜*M}!9����O���K�ԟ��??�~��+10�����j"zI2��Pף?����I�J�5���v��w����s��?i`����Ruu~qTK�7 !�I��I��8����_�"g�#J>���;O\���h�S�u��$�~�W�~w�(9{&���7m_v�Y����֖��IEND�B`�PK
76 +���N� �ddfavicon-16x16.png�PNG
77 +
78 + IHDR��a+IDAT8Om�]hSwƟ�99'�I�M����imkB��bP�x��n�˅ 8DD����^�zQѭ�
79 +z1��
80 +�^��1aӶ:u�n1b��%��INr�ur�_�(�~�=����V�u/���9BX��QB�t
81 +��0�`�ı�_�`���NQ4ҋ��ً��PQ)�4�5���ltX���*�AǔNP����osHh<p����D2����U����9�%� O!���:�vʰ#G�����^���mNI�.8]���ˍ������Ru#J)2�,�O�yQÂ�27qt�Л-��xৼ,{ �a�����w.}��^"�8\.�K�6tvn�2$<ytf���wq�p:��j���o8��CDSr��0'��J����PTM�����+�[�*7E����T�J�Ҡo�ݮ>��~�G/�b)E��DFI!�`u%6��螦�Zدgt|� ���RXU���~�s`1� <��>Ed�1�~r �h�a�/��_�>��,y���d2��������ޮ��;[zϭ�XV0�����v����� ���c]����T"����C���B�)�����p����vՊ�|7r��_�������`��Ōw�}�.��gn}��@!�F�Ԅ�K��99wP�����sO��
82 +|^(�B�\Y[s�}B�͆����7j�,KR�ږ�`Y�^�JEſ�a2 ��� �l�6|>���ld_��n���DžjE���2x��a��vk���<>�}C@0��N�ŹlFn)������$�n
83 +�� ��*UF���L�!`���vCg*��K�.h���H$��/_/�k�W��SFA���IEND�B`�PK
84 +���N�}.<.< favicon.ico h6  (�00 h&�(  8�ZD:�Z>:�[�9�[y8�Xh:�ZX$�IUU9�U9�[�+�L�$yE�(}I�0�Q�:�[�7�[9�U 7�R:�[�"xD�+�L�E�f�@�b�$zE�*�K�:�[�9�Xb:�Zw3�Ui#yD�R�t�U�w�T�v�O�p�"xD�,�L@5�Y+@�`:�[�-�N�6�X�T�v�+�L� uA�F�h�<�]�)J�:�Z�9�[Z:�[T:�[\s?�G�i�P�r�r>�r>�7�Y�N�p�s>�8�W23�M
85 +*�U9�U-8�X�"xC�T�v�U�w�>�_�3�T�O�q�T�v� u@�:�[�:�[�3�M
86 +9�X1:�Z�%{F�6�X�U�w�U�w�U�w�xĔ�^�~�S�u�r=�8�Z�9�[�(~Ie#yD�V�w��˞�^�~�d��������˞�G�i�$zE�:�\�8�\@6�^;�[�1�Z+�L�#yD�I�k�m�������xĔ�U�w�m���Z�{�2�S�p<Y:�Z7�Y.9�Yg&{G�.�P�P�r�U�w�U�w�d���U�w�U�w�U�w�I�j�"wB�8�Z�-�Z:�Z�,�N�0�R�T�v�U�w�U�w�U�w�U�w�zƖ�h���M�o�#yE�r;88�\d9�X:5�U$yD�:�\�U�w�zƖ�h���U�w�U�w�T�v�E�f�"xC�/�P�:�Z�:�[�5�W�!wB�4�U�D�e�I�k�G�i�<�^�)�K�s?�4�V�7�U*8�Z�;�N :�[�7�X�.�O�%yF�"xC�#xD�*�K�-�O�:�[�:�[F:�YB'�N :�Z]8�[;:�[�:�\�8�\i9�[x9�Y�9�U9�ZG( @ 9�X1;�[�7�YE9�\�;�[�3f38�\2;�\�;�\=9�Z�;�\�:�XK9�\Y;�\�:�[� �@:�[�:�[�1�Z:�[\;�\�:�Zn9�[�4�U�%zEo0�R�8�Y�7�Z%:�\�;�\�:�[�1�X*�U :�[e3�M
87 +9�Y(:�[�,�M�q>�r>�r>�r>�r>�r>�8�X�:�[�0�P8�X 6�W&9�[Z;�\�9�[y%zF�r>�t@�1�R�:�[�6�W�$zE�r>� uA�-�O�7�[:�\�:�[�;�[�:�Q.�Q:�\�;�\�)�J�q=�%{F�M�o�U�w�U�w�U�w�S�u�9�Z�r>�r>�5�V�;�\�:�[�:�[v7�Y7�Y9�YH:�\�!vB�s?�K�m�U�w�U�w�U�w�U�w�U�w�U�w�=�^�r>�"xC�8�Z�:�[�;�[�-�Z!wC\r>�1�S�U�w�U�w�U�w�U�w�T�v�U�w�U�w�U�w�/�Q�r>�p<f9�U9�[Q9�\^:�W#:�[�;�\�;�[�"wC�r>�G�i�U�w�U�w�I�j�'~H�r>�*�K�L�n�U�w�N�p�s?�t@�:�\�;�\�;�\�:�[� �@UU8�[�:�[�t?�"xC�T�v�U�w�R�t�"xC�r>�r>�r>�&}H�T�v�U�w�0�Q�r>�3�S�:�Z9�[k9�Zl8�[I6�U!$wDOr>�2�S�U�w�U�w�I�k�r>�r>�r>�r>�r>�O�q�U�w�B�c�r>�r=�*�U ;�[�;�\�9�[k wA�r>�B�c�U�w�U�w�O�q�s>�r>�r>�r>� uA�S�u�U�w�N�p�r>�t@�9�Zc9�Zf8�W)9�Zo:�\�:�[�!vB�s?�Q�s�U�w�U�w�U�w�:�\�r>�r>�s?�@�b�U�w�U�w�T�v�s?�"wC�;�\�;�\�:�\�9�Zf;�X7�YE:�Z/�O�r>�-�N�U�w�U�w�U�w�U�w�U�w�L�n�C�d�N�p�U�w�U�w�U�w�U�w� vA�t?�9�\g8�[h:�\�8�[W9�[�:�[�9�Z�7�Yr=�r>�C�e�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v�s?�q=�5�Y+*�U;�\';�[�;�\�3�T�r>�'}H�T�v�U�w�U�w�U�w�U�w�U�w�X�y��ҩ��ݺ�zƖ�U�w�U�w�O�p�r>�q>�9�[-:�[�9�[�9�U7�X�"vC�r>�F�g�U�w�X�y�Z�{�U�w�U�w�U�w�xŔ�������������Z�{�U�w�C�d�r>�*�L�;�[�:�[�3�\ �@:�Z�:�[�:�[�2�UHq=�r>�2�S�T�v�j�����������zƖ�U�w�U�w�q���������������X�y�U�w�2�S�r>�1�R�;�\�;�\�:�\� �@7�[*:�[�9�[L9�\$:�\�5�V�!wB�r>�,�M�S�u�U�w��Ѩ����������ݺ�U�w�U�w�U�w�|Ǘ��Ѩ�j���U�w�Q�s� uA�r=�U3�f9�[y:�[�3f37�Z%:�\�;�\�7�YS$mIr=yr>�r>�3�T�S�u�U�w�U�w�|Ǘ����������ҩ�U�w�U�w�U�w�U�w�U�w�U�w�U�w�:�[�r>�q=~9�Yg;�[�8�Y�#yD�r>�!wB�B�d�T�v�U�w�U�w�U�w�U�w�q���xŔ�X�y�U�w�U�w�U�w�U�w�U�w�U�w�O�p� uA�s?�6�X�3�W#0�R;"wB�r>�-�N�P�r�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v�,�N�r>�-�N�;�\�:�\�8�ZD8�\z;�[�9�\�#yD�r>�2�S�T�v�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�V�x��ӫ�uÒ�U�w�U�w�U�w�7�X�r>�r=�'�N 9�[b;�\�:�\�:�\a;�\�:�[�t@�!vB�S�u�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�Y�z��߽��˝�U�w�T�v�9�[�r>�s?�o77�[88�W)-�Z6�X=q>�(~I�U�w�U�w�U�w�Y�z��߽��˝�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�S�u�2�S�r>� uA�6�W�9�[�3�U3�Y7�Y<:�Z` uA�t@�N�p�U�w�U�w�V�x��ӫ�uÒ�U�w�U�w�U�w�U�w�U�w�U�w�T�v�G�h�&|G�r>�q=�0�P`:�[�;�\�:�[�;�\�;�\�;�\�-�O�r>�#yD�@�b�S�u�U�w�U�w�U�w�U�w�U�w�U�w�U�w�S�u�B�d�+�L�r>�r>�(}I�9�Y�3�U�@:�\�:�\��U 6�X49�Z�:�[v9�U$)J�r>�r>� vA�.�O�8�Y�>�_�?�a�<�^�6�X�,�M�t@�r>�r>� uA�!v?E:�[�;�\�:�[�6�^7�Y.�9�[�;�\�4�U�%{F�u@�q>�r>�r>�r>�r>�r>�r>�t@�s>�3�U�:�\�9�U*�U;�[�;�\�9�Z6:�[�;�\�:�[�3�U;�\�:�[�+�KG2�S�,�M�*�K�0�Q�&}Gd6�X�:�[�3�f;�[~;�\�:�YS6�W/9�X16�X4:�\�:�Z�;�X9�[k;�\�:�[�:�[{;�\�9�[p:�\�;�\�7�[*:�Z�:�[�7�I7�Y<;�\�8�X79�\g:�[�7�[:�[v:�[�0�`9�[�9�[��8�Yd:�Z�(0` 3�U-;�Z�:�Z�-�Z9�U9�[�:�[�6�\=�:�Y99�Zc.�Q�:�[�;�\�:�[�7�Z%$�I:�\�;�\�:�[�:�[�UU$�I9�[L:�[T�39�U:�\�;�\�:�[�1�U:�\�;�\�;�[�:�Q3�W#:�[�;�\�;�[�:�[5.tF 9�[�:�\�;�\�8�[W7�Y;�\�;�\�:�[�9�U:�\�9�Z�6�W�"wD-3�S~8�Y�:�[�:�Z]3�M
88 +:�Z�;�\�:�[�:�\�9�YH9�U:�\�;�\�:�Z�${GO*�J�&|G�"wC�r>�!vA�&{G�+�L�u?=7�ZX;�\�:�[�;�[�:�[T2�U$:�[�:�[j$mI*�U:�Z�:�Z�,�M�r>�r>�r>�r>�r>�r>�r>�q>�q>�)}J�8�Y�;�\�9�YP0�P7�WF:�]X*�U9�[�;�\�;�[�4�W,4�TO'}H�r>�r>�s?�#yD�'}H�*�K�'~I�#yD�s?�r>�r>�$yE�6�W�*�U -�Z6�Yg:�[�:�[�:�\�;�Z�*�U7�Yj;�\�:�[�:�Z�.�Qr<wr>�r>�$zE�9�[�J�l�S�t�T�v�S�u�J�l�:�\�&}G�r>�r>�u@�$~IM9�Z�;�\�;�\�;�\�;�[�9�[�*�U�M
89 +;�[�;�\�;�[�5�V�r>�q=� vA�E�f�T�v�U�w�U�w�U�w�U�w�U�w�T�v�M�o�,�M�r>�r=�$yE�8�X�;�\�:�[�9�Zl3�\2*�U �0�`�U7�Y.;�\�:�\�'|H�r>�r>�;�]�T�v�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�M�o�*�K�r>�r>�*�K�9�[�9�Z6:�ZO:�\�:�Z]�7�Y<3�T�r>�r>�*�K�S�u�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�K�m�%|F�r>�s>�*�K�:�[�;�\�:�[�6�X4r?�r>�r>�E�f�U�w�U�w�U�w�U�w�U�w�U�w�T�v�T�v�U�w�U�w�U�w�U�w�F�h�t?�r>�q=�j* 8�W2:�Z:�[�8�[�:�[\9�U 8�[_;�\�;�\�:�\�4�Uus?�r>�(I�N�p�U�w�U�w�U�w�S�u�A�b�(I�r>�#yD�8�Y�N�p�T�v�U�w�R�t�/�Q�r>�s>�0�Q�:�[�;�\�;�\�;�\�;�[�8�[v*�U :�\�;�\�;�\�1�R�t@�r>�5�V�S�u�U�w�U�w�T�v�=�_� uA�r>�r>�r>�r>�,�N�O�q�U�w�T�v�A�b� uA�r>�)J�9�Z�;�[�;�\�:�[�;�\�:�Zn�$�I9�[p9�[�+�L�r>�t@�@�b�T�v�U�w�U�w�O�q�t@�r>�r>�r>�r>�r>�s?�=�_�T�v�U�w�P�r�%{F�r>�"wD�5�U�7�Y<3�\3�U5�Y+3�M
90 +9�U 6�U!1�U$�I u@�r>�!wB�K�m�U�w�U�w�U�w�B�d�r>�r>�r>�r>�r>�r>�r>�4�U�S�u�U�w�T�v�2�S�r>�q>�p82:�Z]:�[�9�\�9�[-u5r=�r>�(~I�S�u�U�w�U�w�U�w�C�e�r>�r>�r>�r>�r>�r>�r>�4�U�S�u�U�w�U�w�A�c�r>�r>�p=`��;�[�:�\�:�\�:�[�:�[�*�L�q>�r>�9�Z�T�v�U�w�U�w�U�w�Q�s�u@�r>�r>�r>�r>�r>�s?�=�_�T�v�U�w�U�w�M�o�r>�r>�#zE�:�Z�:�Z�9�\�8�[h3�U7�[*9�[�;�[�;�\�:�[�'|H�r>�r>�K�m�U�w�U�w�U�w�U�w�U�w�>�`� uA�r>�r>�r>�r>�*�K�P�r�U�w�U�w�U�w�S�u�s?�r>�%zF�;�\�;�\�;�\�:�[�:�[�8�X :�W#:�[�:�[�7�W�s?�r>�(I�T�v�U�w�U�w�U�w�U�w�U�w�S�t�?�`�-�N�&}H�*�K�6�X�N�p�U�w�U�w�U�w�U�w�T�v�!wC�r>�#xD�:�\�:�\�:�[�;�\�:�\�7�[F9�[L9�[�9�Y(UU9�Uu@�r>�r>�=�_�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v�R�s�P�r�Q�s�T�v�U�w�U�w�U�w�U�w�U�w�U�w�#yD�r>�s>�9�^7�Y5�X9�Y�9�[�3�Y3�\:�[�:�[�:�[�9�X1*�U l1r=�r>�#yD�L�n�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v� uA�r>�q=�*�U 9�\�;�\�:�[�:�[�9�Z�&|G�r>�r>�4�V�R�t�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�\�}�t�t‘�_��U�w�U�w�U�w�U�w�Q�r�r>�r>�q=�9�U9�\Y*�U9�U:�[�:�[�;�\�7�X�"wC�r>� vA�H�i�T�v�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�]�~��۷����������۸�d���U�w�U�w�U�w�H�j�r>�r>�r<w9�U :�Z�:�[�:�\�3�U$�I:�Zn9�Z�*�K�r>�r>�3�T�T�v�U�w�U�w�W�y�V�w�U�w�U�w�U�w�U�w�U�w��͡������������������˞�V�w�U�w�U�w�;�\�r>�r>�0�R�:�[�:�Z�7�ZA0�P9�U :�[�:�[�;�\�:�\�,�N`@r>{s>�r>�%{F�N�p�U�w�Y�z�zƖ��Ϥ��˞�d���U�w�U�w�U�w�U�w��Ԭ������������������Ϥ�W�y�U�w�S�u�,�M�r>�u@�6�W�;�\�;�\�:�[�:�Z�:�W#9�ZG:�[�:�[�;�\�:�[�9�Z� vA�r=�r>�!vB�F�h�T�v�U�w��Σ��������������۸�_��U�w�U�w�U�w�xĔ�����������������zƖ�U�w�U�w�J�l�#yD�r>�#yE�6�X�:�[�:�\�;�\�;�\�:�Z�3f36�W&9�[�:�[�6�Q8�Z`:�[�;�[�7�X�)J�r>�r>�u@�=�^�S�u�U�w�_����ܹ�����������������t‘�U�w�U�w�U�w�U�w��˞��ݹ��ܹ��Σ�Y�z�U�w�T�v�<�]�t?�r>�q;x�9�XC:�[�:�\�8�ZqUU8�[m;�\�;�\�9�[x�35�X:-�P�#xD�r>�r>�!wB�<�]�S�u�U�w�U�w�_���ݹ�����������������t�U�w�U�w�U�w�U�w�U�w�_��_���U�w�U�w�U�w�Q�s�,�M�r>�q>�o<7:�W#9�ZG0�P5�X:�[�;�\�;�[�9�[�3�W2tF q>�r=�q>�r>�'}H�H�j�T�v�U�w�U�w�U�w�U�w��˞��������������۷�\�}�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�E�f�s?�r>�r=�U9�ZU;�[�:�[�:�[�5�U�!vB�r>�r>�u@�.�O�M�o�T�v�U�w�U�w�U�w�U�w�U�w�U�w�xĔ��Ԭ��͡�]�~�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�P�r�%{F�r>�s?�.�O�7�Z%*�U@�@8�\V:�[�3�T�"wC�r>�r>�'}H�>�`�R�t�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�S�u�5�V�r>�r>�)~J�:�\�:�[�8�Z3�U� vD8t@�r>�r>�,�M�M�o�T�v�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v�@�a� uA�r>�"wC�6�X�;�\�;�\�:�\�:�Z�$�I2�U$:�Z�:�Z�9�[Q0�QEs?�r>�s?�1�R�S�u�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�e����Σ�t‘�V�x�U�w�U�w�U�w�U�w�J�l�%|F�r>�q>�q;_9�U9�[p:�[�:�[�;�\�7�ZA9�ZU:�[�;�\�:�[�2�S�t@�r>�,�N�O�q�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�V�x��͡������߽�_��U�w�U�w�U�w�J�l�)�J�r>�q=�q>�t. �8�YM;�\�;�[�9�U$6�Q:�[�:�\�:�[�,�M�r>�s?�?�`�T�v�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�t‘�����Ѩ�W�x�U�w�T�v�H�j�&|G�r>�r>�vA�f3
91 +UU6�Q0�`5�Y+7�[\$yF�q=�u@�D�f�U�w�U�w�U�w�U�w�U�w�uÒ�����Ҫ�X�y�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�S�u�G�i�%{F�r>�r>�%{F�7�X�9�[�4�\'�r?yr>�t?�@�a�T�v�U�w�U�w�U�w�V�x��͡������߽�_��U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v�O�q�:�[�!wB�r>�r=�!wC�5�V�:�[�:�\�:�\�5�Y+ �`:�Z]7�Xb;�[�/�Q�s?�r>�.�O�P�r�U�w�U�w�U�w�U�w�c����̠�p���U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�T�v�G�h�(~I�s?�r>�r=�p<�$yI9�Y?9�[�;�\�:�[�9�[�9�[b:�[�;�\�;�\�8�Y�#xD�r>�r>�,�N�I�k�R�t�T�v�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�U�w�S�u�O�q�D�f�.�O�r>�r>�r>� uA�-�N�7�X�3�M
92 +tF :�[�:�[�:�\�&�Y6�YP;�\�:�[�:�\�:�[�.�N�s>�r>�r>�!vB�1�R�=�_�G�i�O�q�T�v�U�w�U�w�U�w�U�w�T�v�Q�s�J�l�A�c�7�X�*�L�t@�r>�r>�r=�u?�3�S�:�[�;�[�;�[~UU6�\/:�\�9�[��@@�@4�Z"6�Y98�W)3�Y*�U5�V�%{F�r>�r>�r>�s?� vA�"xC�%{G�+�L�/�P�/�P�,�M�&|G�#xD�!wB�t@�r>�r>�r>�r>�#yD�$yAN'v; 9�X::�[�;�\�;�\�6�W/;�N �@;�N ;�[~;�\�9�Z�,�M� t?�t@�r>�q>�r>�r>�r>�r>�r>�r>�r>�r>�r>�r>�s?�r=�$zE�3�T�:�[�:�Yr��:�Z|:�\�:�\�8�Z[3�U8�[_9�Z�:�[�:�[�:�[�:�[57�W�3�T�-�N�r?�"wC�"wC� uA�r>�t@� uA� uA�q>�&|H�+�L�/�P�q9$7�Y<:�[�;�\�;�[�3�Y:�Z0;�[�:�\�7�Z38�Z�:�[�:�[�;�\�:�[�9�ZUf3;�[�;�\�:�[�*�G7�Y�8�Y�7�X�-�M?7�X�8�Y�7�X�'�M!7�Z�:�[�:�[�0�`�9�[�;�\�;�\�6�]!-�Z9�U�9�[y;�\�;�\�9�[�:�\K�@8�Z;�\�:�[�:�Z�4�Z";�[�;�\�9�\�6�U!;�\�;�\�:�\�*�U:�Z;�\�:�[�3�U:�[�:�[�:�[�7�['�N 9�ZU8�[I6�Q7�Y:�Z�:�[�;�[�7�Y.9�YY:�[�:�[�8�Zn8�X7:�\�:�\�9�\�*�U9�[y:�[�9�\� �@1�U8�Zi:�Z>�@UU7�[j9�[�:�[F�5�O9�[�8�[�$�I3�M
93 +:�Z�9�Z�8�W)3�Y8�[m7�W8PK
94 +���N�!��site.webmanifest{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}PK
95 +���Nͱ�w�V�Vandroid-chrome-192x192.png�PNG
96 +
97 + IHDR��R�l IDATx^�}x���;���w�M���1.� !!!����� �$�|۲!��?JBB1�H��d@$$!RH ؒmb0͸W�ޥ[v�f%ٖ�g����<�c�{��9�g�93�� �$� ��JL���)�%�����R�w- �a�ypj����j�+������-���-����U����Y�^/��I����mI�\�d,���ow�8@'�՟�yN��wb�w�Lg���}�0~��Z��{w4؍u����2���D0@2��O�n�6g������to��e�[�P>f���+������n,��� ˦���4��!�f�A�Iݞʭ�?�ۧ�G�>��I!�Wf���18�dͶ�@-�'�j��e��|��!��J��h��@u&󃹋�ꉟ�VϚO&?J�T�`�~d,��w�V�}y��Rg�]殘~�N�4�Q ����~w���;�-������� �y�f|Q��u���6���yK
98 +Z�i7��Y��֎�M_�&���]���]�>oՌ����,!�M�iܲv�Ɨ�m� m^|�|M���v��`��f=��;7W��'��'�XȆ� i� `̱�L\����k����&;�a����Q�y_%�D�~��`k˜�}����Wf~D� ��~�˩D��״^�j�����]9c�W.��a<�&�w�..x�~��-��'T�<>1�LX��vl����|]^V��# c:����1Զf9A���?�l�~`х�����3h)\=���~_�����]���+3���ݳ � gQ�,�1���wp,7e��h�MMu��� k�,1�D�lɫ/�u^Tvþa��h����αk��;�`����fA�S`���g�t��H�~�������k��R�Y�$��%v Ϙ���.������ɩ��-���~M����m�v���dO�h�q��]Ìsh$�������� ��ԭe*��<�Q���̘���[���R�%�hq ;�"W���pdz��[U8oe�3�M��V��ZsњE��h7�ɩ����/Ry'��a���dm�Щ=-X�q+H{�����=��23��*M}r�{|��~�r�x��nm��r����n�����d3຋�n!�`z��`�]`��:�ﺻ����y�]Y殘��i�c�v6��+� j�d�cO��ד�F�~��i�����ʢ�>�a������}�3+ʂ�3���?׳2}x�� ~(gQ��;��+3���G�� ����Ɨs�޴툶 ��*s �/�X�~��ko�eO��4�)ɼ�@?��U[fTƝ9��¶�<�( ���&G�yb~ �<���Gj�fP��i��-��x��*�n�X������4�4��&�`��6���'f>K���cܞS�f��"ί�~P8I5&���h���`u�\6�WDo�+6��Y��G=��j��(O̫��]����k������~��{�o〒�d�D���(�!� 0`���!*�ʫ�um5��<=ң{���,0���Ey�}}+-�˽;��<� ��uFؘC!�,�?y�����<��2h��<M�|SNV�����Y�������a6�Y����]�r� �ot��w�Ka����o���ߝ��̋I�_��]�mάr0?YT[���nt���LM�ݞg@ڥ����"DZ�k�ߵy_�{�,ψ��49��vG��S�\�pc���5�[�_�qA��J"�ha6����@�]Gм��& �% �n�1��,.���v�Vf|����N��� �|�‚������X1���WmU�\5L�s.=x�s�8������Q��0�L�"wц�:����XH� ��#3��E��u� �3v�h5M��r�6>{� �q����&�]�xò���_�qA��ݘ�����;G����ߕ�@��$��&ɵ�k �����p�#J���2�A�H��V����~��e΢��G.�����ʩvce��9��p��[��P#Ze�,�� �v΢���m� �����\��NL�ʙA��vi�lN�;5�SS�aⲵY��m�[�`��q0��A�LQI풻�Յ�o��ɿ%/Gxt塹�g��k�He�[r���e�Vd��i�g��?1�_�(��#�_��\#-��Y1��X�f�ƿtn+hTw�7�_���&��6��QVe��@r��!>���/.���]����8�$�p������'@n�a��˦i���<���G�"�\qNB��'.���jj�;;��>2u���
99 +�1l����o�w��������; �Ј<̈JLJ����S41v�i���`q°��&h��x��ޖ�� �[1���o(ɖ �e9������3�����$���݁+_���Cv����@�S��$���2u&#�n�h���N_s����VY�a�_b�;�"�� �����{���\�z�7����R�|vΒ��dm�����������L�f�?��8�0��E�o��i2c�
100 +���7os��B1C+2�(�6`�7�{��uMW�i���E��ns�@�df�M�I��d�k/pmn��f�}ը�m��1��D���1!>ƿe�[�p��m:��I��1��~1=9*�5���a��U�0��?Й��w�"��k^X�q���Ğ�q/i��z@�A#���u6�7�4@�켤�@0\;}�|:km�!V!B���q��G��� ������u��N%�`��fm�V���<c�[�<M*�@��vD��l�m[*s������-`<��M��ld���Q��o����=��N�6���I^���Q��9.�ī:���n��36U�/~=��@Aeae����4������
101 +�_tj�'`�;�G�!""^�W�I����qɋK7��jl��q'��H#����z��`�|C�|�lI�����Ү=�V��I�&��_��`�ғ�A��cNׯ�9B���4���a�'����5z���������I�>�~��Z�"�:i�ƺ�U�^F�
102 +� |�7��]�,�������!�ʶ`+��½][׎��ܕ3h���c�C�d�0��]�i˩����6�����
103 +�!5���!U���u�K�`s>��@��ukKk�������03 z�.5��̯��ưqC��a��������?RRn�Θ���۠��� n6M�)wqA�������U�;�y+f�H��$$�|��S�ה�T>�h��F��<N�0�#ӻ�� ���������rm�B��F������7�)�毜��H_�о�0�[�v�])<t�4� �Xr��K��^��� ���զ��������`D��Ta`_�S,H�<Gx#a)ԝͱ�m ��=���W��e����f��/"X�v�`Ӹ�(��3���}"2{��h�U������ ���b�+��k�EI� ::�R�;̫햴�F00���j���p�F<M��v������`����j߰�@q�c�G����w\�:l���ͨ���_�NV��""k��Q=�-wI��*�z�,E$$�a~���Yx��k�ݱ���PO��}*„y�2�Ѐ�,����� �hi96���f��+��v���>��_���{|�����D/�z�44�\���={�`�K=��xq�����`Fi�mM����k�M� ��љIC��Fi��A^"���Yj�4[|���k�"�ڃL~�&_��Ԥ�]_�5vJEX�n�n� �K�˥�߭5�Q�O�6�D�i ���'����Y���a�f�y �������퉊.wiI<�J��S'���$Äu�a��0���������E���L"�ʑ�L�K�Af*%��j���4�v�?pSS���Ϟ�kj}�����p�^/�v̎�3z��FF &&Q1Q��YvK��� N� �^B�������$�<>?��a�8^ f~�4�lS׶�(l;^t�/� r�1i�T��w�AT4�0wq�d�p�Ȇ6u�T=�W�� �<��I��e����9�p>l2�����a��k���������G��z��. �u�M1�"2:
104 +Qё����<�n v�Ů*�}�'Bъ��V���X�� (�&U}��v�WQ �x5��)���x���"��R������G�4��w�+���f�8G���<�@e)3)�A�����=69�X?�&��!1s1-��:�zD�L�\f���>��8��ͧL"��ݜe��������xkw�]���[Ǚ=^���yd���0��@<� u ����� X�K�%11�U� #4��f��l4 .�9�
105 +�t2�6}�$��p{�%%*����k��e�\ʴ%׭ʜ�f�"b'����������������b��0`Pb�c-�ЩLr�Tՠ���M�����=�%$$�Y�:A�mx�̟WQ��GC�{zN<�d�?�K��-�X�&+�W'ӷ�`����LjY T/��ښZ46�n9�E.�=)%�I����d��Ux�S�*�Ҋ��z4�7Z�ZÛ4Zxc����,�l x��2�=0;Q��0.�y�8����xw����.\Ϸ �J�Vŷ�¯�� yW������� ��H��N�fW%�=�Tբ����JyŔ�)p��8˙��F�࿵��o�1kK�r�b�^=�j2���l��X"��� 8y_8۶ @�י��l�ؽ\�e�e�\�!{<8d v��ݸO��EDg���EiQ�uE
106 +��<:&���G�W�U���ܚw�gY6Txrӊs�Z�s �Tżʆ�Ӝ%�qR�%7,�>�t������뱇z���N�� 2�RrO��N(_�C��ZKy��R8H|!�q����gH\v.���r����1��7�G`Z�� ������������a+�ܸ�7��k�t~ݎC��ʊJG;�,�cF 95ɲ��/�#��ጓ�_]Y�ҢҰ�S�A��������U
107 +�(�@߽��A������U i[�lf����S��q�΃�歘y�~`�MmA��� &f��L�G�@ʇ`[]m���_�#� GRJR�.|�9�`�d��NM��|h�uE
108 +�)�����Ɵo]Y+o�^�Ю��: J�ft����VaG���.ʟ{2q�����g���DLC�f��J�+4����4��Me���������r���(e#Ǎ�����47�bҐ��� ��� %h�t>%t�r5�,��̩�s��W��?}��x#�O�N7<6}����H� ��5�� ��]rre�� t�k��ʒ\�R�n��^'���;��D�pE��L��i A8�0 �(���Ҡ�6r�(� r�n�<��ã ��m�i���z��S�:t���:(Bsc��j�ǒ��CM��-^�CW-�L��W��n�FVMb�ѕ�ӞV���N�\ק�z���Y>1)BKX���/.+-�r���¤)gZw�� ��|6� �+��Q$����w� _0<�e_�C�O�(DUy���U��\j�� ����(ݫ_�k w��Wi|V:{"�>�9����}ߨ��1�/}w�A�t�np��..J��;���c�0}��qu�UE�`�|xhs_ ��+� ѿ�t*�B��e)�>))1�4} �EA��1]�d.�,���� ��^��41n&3��v&�=1q�֡���9s�y=`��b��ڀ����^�k�'b���ZQZ��C�0�!Eٱ�=���v����]���Z9lp����H� �]dd�Oo����F}��!H��l��w4�z���7���^E�ʫ�k��Q����8!1A-0�����3����?e93��!k��:\@�g��'"�U���1����RzÄs�g`x�X�.�������i���@�@ia�e-
109 +՛,���6ϱj�)����`����a���&�GE�$B� d�i�R1b�>S���I�p�Y�W���R�����t%1������`$��1�ĤD[n;$��a��w���T�#�~v���"��] ���[0f����wsi.�{��Ӻ+p� ��=oY>�ӝd���8����
110 +EEE��ռ��o�&��Ҝ����*1�� 9@c��FA�1!� .  bK�K��6�l��)R0r�+Yl_R|d"& �����#v.Y ��&�*�*{L�ߗ�;�}˼��qhߡ��D��u��ogE�5��k��L��M�4=e�Nh����<}���-�� vK��$�5 E�V���,���3FY0羦(O �$�@z�HD{�0���/����m�:�a��΂R�|8���e�k�;�JN��d9Y���̄g��O���vt����ظ�{ٓS�bZ\ctҿ�LWK$bOcDQa���9>!c&������3��HK��%�FLD�A?�닰�|;ZjC�]�{�{��e�J:���hbb�Zvӏs�<y�[N�j~$ht���YD�61]���*o騤�D)s���?� ���O�s���pbdi�A���E��'zm����O��y��]>�2]Ӗ3�H�)Rw�d+�+��] 3 �����:.c�5�������U�����Y��F�|�G�T'�;�:�mde��@�zgy�ef� �����0����Ƞ�(-�����Pk!j�)6!'O�5���tz��8SG�ok�-�/A���� Օ�س}�c�� ^�~e�۪i�K�?4+&�4� �Hpi�����Ou[��²d �M�F��ςq�����}>��I=l�;���F�1�Rm?��N�&�ۑg����
111 +�B$P
112 +'��{���o'���� v���ˠks���D1!�V)�[��y��-a�ZZ ���:�� N&߹��)��ʕ�y.2*&O�7��2`��~��@9D1����]� F�����*wR��#I:��I�����C&�uވ�lu��u�V��$]��B�`���P�H��!���555V�[�S }d:��
113 +ŰI��0*m�����kl��]^Z����;�N�����;T��0jQG������si�?0ah���aӜ����u�5������%™*u���q��jE� 4W��B"GX��c�?�؉�s�I �! �q������(\��18��� +gNg�g�6Wp��|�o��yK
114 +B��ץ%r� I�|�`�s@�r�`x�H��"+���A�"���XI������‡���`Ԁ���Է�`���5�@>+�,h�p!J�J��ii�qc��C���+�]�b�\byα�?ۯB�����ݹ����j�
115 +�3&�� ]T%l�z0���D���ļ'H��،&�d�3���fTUV] Zu��H/�M �Y�/m\s��9d*%�Kw��/S �k��6���Q"��a���_��J��ܖN]0Ao��yۻˋ��V/�[gLM��=_�5�� a��eL���u#�q��[BseŅ#���y �OA8 +�^�K�&L�mh6���6�w'���I�K_��)��c�1l�P+�m��}��/�����Y��J�yۢ�����+�0h�O&F�bGiпB�+����V+�?QW�����X���BdC��1N����)�c�&o�[[��}�}�:ۣ-���1���`L���,�b5nd��K�f]�,��iv����65cώ�V�Ub�F������?�D�Q�Ȉњi^`�g�q&��T��;������7��*���X��ق��:���lh�� ��H{P�];�C2A�3 ɂ?o���O'�u�����NG�2M�j��RK����������D/�մ���_��g�+#+=Ig����rN$HѴ��V�P9���vy�i9 $�x��������aA����n�[��`8'�g ��zkʠ�������8���l�'�A�(2����eh���?�*I@�D�IA�Ԯ�n5a|;wѦ-����s}&�g�!�51`��TUW]�����a��YUa�����C�������Bs�� ^�g���վ�l|{��M�R�?�~�� �ܕ3h��1�e�`�� )�!�C!Y�I�I�>�1Q��A(L �3r�,ջ>���*$'�JL�o�� IDAT�QC4�����ᚬ�o��������3��~`
116 +���m�d� ,'��*EFGb���H�j�����-��X5�$�D��V���m/��O^\�y��{Bi���e��S=1���H�μ�!����Yq�CG��}���� ��ݹm'�k�;�;ڽ�R,���\]�o~�ǡ�do��?�1� ܭ�v�M�Wd���/)�7� À!��
117 +8�Yӛ��?���E���܋�b�W����)>�,D�n���ͩ/����j��+��H�x�MO���9�{���'� V=�ސ,�Ĕ��HW>^{��g�9�m���;h�TI*Ӥ����`�mL��׃p� �MuL�
118 +]����.�+�@�)غ�0���Ϊ$J`v�.�"��QìR�'��L` �H$D� 6"�J�+� �| �k�A����?��v�ܗ�d����O�_LLJ�����$�M���d4��D�N I歘vi�'� �2�XeB��C�u�\�m�iI'�Θ,|� N�������y�;�r5�ԣ��E��-a8UIpB���V�N�~oT�5~}��-e���c��zL�R���P��ˌ?���]���w*+*��lJ�����
119 +j":&���%�wsi�;�������'�]�Ǵ�tl/~�uŧ�i �=;����Zi!3s� s�����iSi 퍜 ���3o�A"�(��F$�Cu`����{����ؒO�ݼ�u�]Iqn=�.�h�$�#�m34���CF ���'/r�7˛��A��[nDE��\씢6�@�T�b��4��ڢ�-[- ��7 s$�/�9���_`���A1�L8���t�ro__s����]�>�H�n�W��+���|-�sZ��<����ҫ�۟=l�u��"�ʀE�ۿ!�4'*��6;p`�A�+�h�3�o^����j�� ��4O� �4���1Xܿ��a���ü;� ��'H5ͺ3e����HLY J �';�,��#�"!)��NI�>i�4�ԻӦ������,�$������U�=����_�e�;�z��B��r�l�� ���J��Ui̫Z[}��}o�cMo����5�$h�B�rY�˥cب�HIK����J��=�h����|Xެ�f؄C�{T7���ݡ�(ܧ���0L�� ���r"'�$f_����&�= RH�)�M��M�,7ß{(�i;��w�r����7HA>�Iu�p ����8k贰�'�㢚����F��!#�L�������u�(����K���8��~�LOI�<>1�L�e�Xil�a�!b��u����5gyF��ƥ�@�����q��QHܱ$�J�����_AZ� '<ﱭ$�ݴ�?���T#1kK�C%J ��\�l^���� 'j���Yvӊs��*�f� T�L �ǹ��;���Q�I�I��#.f�G����Zk�Q�@��X����ޞ^Wf���� vlQ���a�����I®O=j�o��Ov��`6L6�~k��á ���Tw���d�4#J��z��m�«$7,�����1�5v'3��[����ѱV� mW�� �[��#V���܌���^9ϤJ�����0���H��c.B�7�>���0 l޳�J�ޗ$��v��fF�@kX�r
120 +H�LY��38���6=V��<�I�3(9���L�@���ʘ�|� �ᅥ�v��BIdQ�L̸K���ҝH%֌�� 7J�B($�ꛉ�2$C� ������%����b��$�`�E��85@��I�00a("ݑ M��Gf-�f����f_��Pr
121 +l�`�Z�4f_�u�+���w��*�z�H�o[�����;!PX{��5 ����Y~��X��p�㺣7,�����1�VRR��P�MMMV���<���c&�I'�#1k�WN�+��)'��AgC�ܝ�cU� �`G�2.uB!�g�';-Ĩ
122 +1����^���,���0�4����,��&����Qe���]>�L��?!��Jʔ�ɱ`�1�_���6�+�bxV��]����Q����>d����;�q�8�g��i�J�a��`U~ �,������tH�@;�H�RZW��%��%��[N0B ��������g�� ������]�[ 46Y'�h��bmV����ߑXB�����9_}�dN!h3oA�B���,O��jÞg�2�v:FW
123 +�ZN��� 2ʙ�xT�Lz^X,J�6�
124 +6i���H�I�P%N�^2��
125 +��?M!��9��Y�� ���^Q�POJ뜬�Hװa��Y�p�Qg�f�'�&?��UpO�@IB]�zF\��?J�i7 �.�'����744������ �B!�JUI�� '^
126 +���d�uտ��?:�.T��z��R'���ɣU�rL;I�s�r7>.���/a�D���P�$J��0x��.�*M��`�_'3�G�:��L��6��z1���E�4p�]c��c��p:��V6��[��O�A������wiA��4€A,4�8�TiD�8���F����r�w�[h �g]��}��'��g�!��,���M(��福����{ ź�Hx����^o�Ad��=M'"��V�4�>����/d�,��ӓF�/�8�tz��H�k7Q f���Mb�
127 +�ǚ^RTټ.{]P�b��A���s��Q>Ĉ�í�\�;���a��>s�[�ش�ߨm�=@Rv��,;��t�OrUc�U�I��NHr�n�x�rZE�A~�����ܬ��'��]�3b�K�T����&3����%���f/�U���N���q[٪��G�"0y�L$E��HS��e��Z�qỖ�%$���3�jY|�AA#h ��NH�&�����E�JJ
128 +_�w�F ���,*X���C>V�0⨶�`E��L�sj�x�@�Z��m�29��f� ���� ��|��2����NJ8I1�&bP�pۀ��u���Q�!���V�;=i� � k���[�q:%�'�u���ZRb������t;��2���n*�w�������"��3���租�'_�!� ՝���������\��|�@��\#$�Z��L= Q�p���� 6�p�j/U�C��!�S& ���'9��Jjb��uv͎�=4,��Jvi+�Mj
129 +"#{rY~)2���o��w�/I��\3�]毘y i���f�j?�j��� �{�*�ً��/i� U��M&E�c�W����ԸA��L��\Ȏ/ 7�SW՗�g8�$�:jX�9#Rǩ?�в�*������B�5h�����1��5���j��_^����W�`u�B=@ [1gp 3~�W<��$I���<,��ڣ+��NH�ǘ c �{Cb���x�XF��W Lb��7C�Sҫ��h; ��q�=NR�89u��f0���j�k*iԏ�dC����ED��-׎��������m]t(�x� f � �0}����j�k��;@#x!���Q�&����묡��:޽���ѡ�!�Vr�~��v�8 e8h��d�m0|�A��U������TI��
130 +��d]=�j2���(�gnr�i�7�fm��c�gC�����̩D��\Bh{�@������X�@�C�%E�a��/Y�x8Ht�-��;�t�[x.��j���MZN�.Ȳ�u�'��1� x��9��+�w^8� ���N���b����aXq�O�kj��eos�Ȣy�f�ӥ ���cp�E���3J�^A����b:U���k�苐�S���뷿��"p4 �,>(�.�k`BB�o5lw�� �P,As 4�?$2�0���-) �sx�@��-�}��Jg@]�B� �-�7�,ܴMe�v�Y�2�� ��㉺�1:P�r��`�&�=�8D�7h�e ��� �}G��Y�QȽ�+�+�o�Znݥ��:�Aͭ9����kݠ���o�x��ů7�+���� V�<��[0������4(��%�������2X���X���o�*�S^�A:`p�U�[�';�x�1u��H���i�0 ��\�w����q���F '�a;2�����K�U����밇�O�ȘnX���n�i0'��h�"�w�*AbM��/Hy]'�嬲�R9��d��P_�Xq2~���`����F��=r���l=X`�8s��A�~��v45*T�d�4�‚G��;p�O�to�8�/����"�M�$�m�<zH��o�nZSS�(�Lj�> ��Nv��PJ� �3l�c!l�LJ6���`X<Ԗ"��nT+�0���n���7���'�8��ܕ3&뤭�^�}�>TV:8�.�1�^�;�l/H���C�E\Tb�ɻ:�aj���q������}`��(�Sg��ٸc���g{}�������60��<C����u�T��H��P�JR�l성V*�S�$nA ��h�:���� �������(�/ $�hޔ�a��}�,�j�0�G������8sܩ���&�-�쌟�i�j�pOo �1[JK�( �z��/Q�ǟ5��eۏ~�$C�Ax��B��Kb�}�Vǁ/N�-a�ْ�.���?���/�>�SN�ʸ����q�p[�F��M`���m�@����d�a�7`�Ủ"|ƙ�T�����n���}�Ɩ!��ts�����ƝR`e��9]c��#p����4�|��^㾊���}xw�x{jLr��7R�d_�^"�D$�֩�pƳ�K��w?P�c🸥ᖾ6��Rpղ̴(/��g�~׃��_5�Ɂ2;k�e�-������!1l���"}*̒�V ����ت
131 +dG&�;-�zݖ��%vm{��)%W��:(R���@��'m��}$��5�信��uKJ,%D��W�\���^��t��S���9 ��m|j9�lI�ad^����n���������yuz����Mr3�̷�Q��.;�����]�k�+�`�� 5 ����}��3M��d$g�1�_ p��_�ٛ��:���SJdPM�3����2Plr���M�λV {�G�5{J�� �E��8ֳ�N�),B�mZYf���^F�%�W������&s^��)�u?w}���AL�(wQ� ����ŃgA�_% Q�q�%&�]�1�*m���Z�\>�3��nZU�<�˞��3�4=�Vokj�Q��۶St�;�C�Uȭ�b�����a3L<���y�!����3����(�@,�N�-��M���'���CJzm)s��wV�:�±2� ~9�Wa��Tgo�H{nM���:� ����S;�-�j���@Gp�M:���<�qK��;�������w�c��1�ۅ gO��觞9P���*�aK��Ȩȅ�Q���ݼ_��v81���i���#b\ ���, �$�CC�o����3�[:h0'{�q�1R�^�d���ί��:�4 [���Fà!Oe�*F*��M��|K��%�x�7\Tk*��$oG2>�QJ�� � ���0jѦ��n�\�O�˅Ik��Y�+�X���oW�.��������HG]���F�L;�
132 +Y80#�8TH�A�ƍ��'�$�MR�464Y1������:Tx�۪�#Y�cbc�\��KT3Dt���))n�%�.�D������A�ozaIA���\
133 +��c�潕s@V!����Բc���
134 +I��g�8��%�Ֆ�)�A� ?a�8礔$ 2�JH�ׂ�o�~�* Bb���
135 +��w�M��v���,�p��N.zVl|��������9�qSVZ�;<f�����ǏdO��}Q[Uk����s;�) ʵ�a��=�(�O�(q�"N2u�r�����8��ύ��=+s$c����$�`���*$�#Ɲ)0���3 �V�M���d�MIK��a�����9�vnۉ�
136 +{G�%i�aK������Y�P�� ����q��X�Wɤ����Xw�G�&%vX��\)&O=˺_�5�b*-*�,*FP)�Ґd�'�$Z���EU�\x(a�����D܉�6!�1�b�3vd�>�u��w��Jb��d��tt�Iܰ�
137 +Iмܧý{��ڭ;���۵��8�2�.�HQ�cGBֆ�D/���mhn�7,�n"W�p��������#�Y��cN��ȵ�;{��ڣJ�#Z�jj��`_�G���3&��3h�U����v�����,���b!=�'��w?T�$�JNI#��d<��\�9��i+�V͘Jp=G��v�nOM��Bk��a�Άd�:�V��� �ߏ]�v+]#z�~�}G�1
138 +I)�a9�DOy�V%E=**
139 +I�IaЧ8�&�4�k���{w����p���i�ؗA�Zo����aV��S ��nE�3~�eZ �5��eTZ�=;��vZ�χ3-��
140 +�@,������YW��c����a>�7�6oIA�Y�u�`'�����4��ñ����Dć�� ��FEEIŹ����*<t0��L��u��ĩ���mJ%*�Ti#�}�@��ﮍ���a�.�*8lDE�lMNN�%����ȌH"�vQR�jb�jh��?x�ߤ�yY�Vb�n����f���̥Nl2 ��0�4L�Wk��%�5��(������?�T��R���4���D��{w��%�%c�1�:��_!N���2�O�Jݛ�6�%���LhI��d�AZ����H�,�Pcj\l�~��P�����5 �f�;;]͠ Ve,�,NK�h��������o�����N������v�z�+w�@ �Eb����J0I���я�"%�7fQ1��ܶ ������7�s7,/|-�s9����Ș�~��'���o*�1xf���-A�����Ը�H�Zlם��x{ņ�O�ԡ�Fc'���FC%Q�%Re� .��Σ�J
141 +C�c��NK��W�i��:�&t����~��}q�f�Lmk♵8�j]Ë��ţ:fB[��pP]M�u�)�D��}m{�u;���z�ڶKi� ��L��<Z���C��uz1��zt�ʙ��SLH�"jLv� �.{� j5<̾c�8�K���y#<�4eRX�,V���*�ݹO9�o���$0�I�BhK))��= � [2Ϳ�-�n��P�����C��V��:�=a��ht��!��D��^ �xqa�'̛zkb|Tt�K�)mw�8$������
142 +�������Ȝ7��GR!�M ��I�`�H0���|�ʢ:��'N[VH���hjZ�An�&����n.ʻ���]��� �
143 +�3�~MӖ�\�D] �E���m;h��9����'¡Yޚ����B�����K�Gf��VPar�m.X�>=.��>"�#�]Sp����
144 ++UVbY�����;�B��J�`_�}q 0����G��Cy��gN��)3���Y=%5Po^US[�s6��/N$I�%ׇ�҉V� d!DC���jK� Б���*����,���L�(p��f�{=t��i_g��TTV$���l�oY�£�aPz�c�[� ���a��+L��&c'��b��,z9��J�7tL��wV>��=����n8'��OK�z]�� )���d� DU(u@*FXel���8�T�复�9O:wRHq����O�W�4NNM~��������;�I=%[󴓹��
145 +ܚ�<#ɣ�� �D��Gc��_ZR�t�G�DYY�{$sB��ɐ��2�a����n�Ê�m�@�x����� ޶��(u�M���(�\��I:{~�]����>����k)//W
146 +���>�J�ޒ@�?~Om7���:���COЭNI�=��@t���E|B�X��@& L���^
147 +�-��տ��sR��}^� WR�y�"u�H�����~g�l��t��/����ɩ��ϕi��
148 +����5H��� 8�A�AG������%띠A%�� YY5�Z�����G� o���u,��ҡT��Ix����rf46bA�� ����'��M�������qw��/.Y=ƛ�)����ծ�Ǘݸ���J:eG3iʙa /<�1b�}����bD� �8�T�%�&m@�m�`� �Bz�)�VQ�.ֲ�u���/,*���;}�@��!����^�T�0R����
149 +��ϲ�� ]�{UfIDATv�ޒ,,A�JP�$��K8x���N�ANI�%��oU(::ڊ��)�Ż f��Z�U�/��"PG�ϵ��K�>_#�r�A��B��
150 +�H�y 2��}��`
151 +))�* ��6"�����^_׀�PΩ$���� q3�_Y��)��y�d^���<[���6;b�%}���G�A�W��;�p����� ������"X
152 +�Ç�,��=;�X�kO�@_�SbӼ3'�@<�G��V��bJ�'*� ��t� �X�@����<�0 �U�a �h�p�m�0�e8��P f��S�b��^� ����v����)1)11m�)��ؼk��_� ���'z< �i��0�-^Rq��M��i�O������2�ڐd\K�Xa�n�sM�Mʋ��mPl�b�_ovbq�II�bG�M��e�������M8`�_��s���Z������ܕ3fk��u�/�=��A�. �}q�f�t��AWi��TJ����b�c�$�(ĢWWՠ��A�D� ��QHHN@RJ2"�"z� ;VЙ ���Jڀ�M�.' ��$š/��'�X��*����ų������M��Y�K!d��0_ ��5��X�)�z��I���$�Av+�N���% Pv`1�ʩ )��-K�� r�{���c�b�$^⡖��P`�G����w챲T�5�i^3$!~�3ڥ�7� N ݽK6-b�lܼ&k�{]��=�U&r*��a��4vǼ�s����R������t����%C~�L���S
153 +W����ѥ�n������ $��*Q_�ef~I��ݏᰧl��! ��
154 +@*��H����_S�F�� 2/}���/��T?͉i'P7���Ui�u|�H�[�&kK��L�g ��z��l �n;��3{� :1��������։�B��†q���%otў欞��zφ����<��FH#혢 �D(2;A�{D榢겭�O�����?Y��D����S��4���S�t<o�L���`��) ���G�6ۏ��齃�GN%q��A�p�u=cu� ���ɑ���F�g�iŰHk2�`i�:��i����Ulk�����l�`݌�'{F�ɼ07+�Y;A�z+�Q1钌K`Ӷ#<�y����8��n߫䏰?�� �WmX]�ގ�}����
155 +Ԇ��(�J��.l����9���o���H�L�������M6m�1���z�R_��zpܿ(�wV���v�d� ����nz�ھP��9{�s'ž�͘���  z�b����.)�q�h7� �����яM�<���"���+�46>�&� �g��g_k�T!iox���Ќk6<z�w���
156 +�N���,?w�W�X� t�PZ��`h��,ݰ���?������]a @VEy�UW���=~$b�T$�(_�����t�1::�4>!��/,��y�y�a����4�#,ƛ|��1����=4w�������.p8�����ʕ�P򺈨 �'��p%� ��b}��&�OJj�����8�;s��?~� ���s-�x��;p?-X=}6L�2Γ��|����؈�j�"p� JT�*�~Їk�ˮ%�E����<�����#�"%����y�Z����(��� �:�iފig��љ�=&8x)����S�N��R\|\�`�����x�w�G]�m��
157 +^���&���_W���l�I�B�őO� �
158 +'���KȜ��A��%Y$R ��^"�T:�q�+.���[���B�[p`�A��{��[��N�O���o�=��d����lض����E���S�"-�)&�n���"��T�W�ؒE1d��rҞR�o�ν��T�� k�X_�EF3��\�M`��G��ͻm�Z���7Sm�/6��2����Ĩ_4��;w�>�Կ�\ $��� <����� ������:�"�?>>޺��3�m��n�V��x��`�e毜�m��B�K�}�ο�aT�W4�|�8x�<+H�Q�FY)T�48Dq"V��+�F�uN):&ں�����E������n_�{����/�NG�־_z�ۼG2����I�ƪ���c�~[RZ�v����P���,�@|�U�-Sgu�u痻�S�@���TMb��33� ��6 �� >�LU������W������/�0J���g=�w+�Y)�\��^�w�6ؕ�0}�۰Ɏ�24v���B�d9�1ͭ��@eYHA S��E�^�C@Qbr�s1�1�'�[;�Iu� .�����%�� ��[1�\���UI���3l����a�����{��5�L�\�#�4�-�\n$�Rbt�zr<H{C}#J�J�\�N����;M�'Ľ�I�_*�f��6������@�ڷ~�O:x��l �� �X�5�gI��u�I��g��f���Y�7qo͆6�:�k�Nk�`� vz��,�'�a舡��}uȮ/��K�JPUQ��/�:du�a|c�ůa�\��YJD�٣d���4��&gɦ(>�m�~�J�� &�2�R�㻖M�v���?tW�����w����-��#��@�oK�FQ�Ez+ ��;B(�St����� � �f���?t�M��� ������U�
159 +^]�h��U��� V_�b����QFȆL��Y�^���w�,NH��b�@ B�`/ ^�C��*.>baǙSA������-%W0=m� �����䍟n� 7"bp���5M�@�z�g�y���7-�{��� @_c��/i��������~���-)��d~��Qg��
160 +����]�⏊�DBb�����,n�C8���l���Z��܊��:464Y����[#c�'"��ln��[�ۑ%#�H�ejx���s���f1�n��i�ڪV��n� @���j���1W�\"L`��E�r��L�H�1���ʊ�U��]���
161 +���.$Q��o6M���O�{}1y�p��[0�����Q���9O��
162 +�� $�"� �wr�Q0�*<�M�tuZ>�<]�߉`����l�� �7J�@�t�CS�"�^d�?@��]�T%I�"^��
163 +� ���*�Y�tò�ц'� ���� Nv&��L��,��ݻ�~��.8t�/�'G�?10��Ӟ~�o�+x�M����+3D ~D��x!�/���絠�ր��%����8
164 +���
165 +��]%���%4�;�t�&�/�� >f��Z+�^8 ��ŗ����2�`��t�>�J�T�fޑs�Ɨ�,����ȷ�hL�׉�I2L�Bz*�����ѕ�-����k�l��3� mŇ��vA*�@���� b I�(v�0��֌e�/���ѕ�������$8��p;���ȳ>��� ����*_�ۅD���3�$&�c6QP�@ɬv���:M�8**R�FGC�;��a9�~�w�|/�B�͙�zF�aP�46�d�j:"�`z��A��v[^�6���j��?z��X.� IwUc �6�9� �T<�sW�@�_ш2�zU�=^��������վ�b+f3HD�II�ZTt�l;�C�rZ���E�����ڬ_����W̼�4������U�ijjj>hjhNa�`0�U��v}��ޞ����M�s�M�oϘ4������/�N�׼rO�}q`Ձ�Q�~�#�J�m���h��T����+
166 + � ��t5�)DνǡL�RIe=��s���6�,�/�\�=5*.����G Al�����������x=�/}��˞���}�k�0�ٹ5�?��~^�y��A.W�<�KPL�ʹw�I�6bˏ��X�PVr����h�ut�`U��Z��s���V��߶4ٯ($s8�5�����؎������(��$z|3�k����-;7\�jֵ���xm���܌�<\���PX��-�\�������u��c���(�q`W7O�ʻ*�6O��E.V��� ~�(����#���!�u�/���q�H���C�d���_�wm���λr��A�y�˂a�X���򇙃~���`0X �H"������q���4]#�Qtx��V+�F�E�/,x��������� "rT5���Č�r�����x��/}�m+������b�&�8g��t&��*� �����"1� �o+=X�O����k�����ߙ{w�.��I�< V���� ��ҖbP ����ш��>h�jѨ�ە�5MDLL��QB@QDIlh�5�̶Ԧ����l�����33g��w�̜�_�b4�=�8̜��K״��KuxV�k�u��*���n�'���U�bp��}I�?�U����Fu�'[d�/\�k����0��YФ^�z۪��Ly0�#"�1c��RC�k���?mnU�K�TM�𫏺��o�b���e)��u�� �=U迩��z�t�nx�a��}F�?
167 +�HK��|��O �q+� ���8���ux�x���"�L36��A��t]����i7T-�oc��0��G2��-n��2��U��`�ZQ���� U�kK$�x,�Ŕ$
168 +S �`CUj���W��kFul�ۿ(~B,�z�l<���g� Z���s��L�'�@�v_���y�JΜ1Z7��dۼΘ|��U��Tf��Noz��}�|���� �2�1��y�M|�g�`�g���/;��}�d{ T���R*�D��h�
169 +�f�el�u���Wc6�A�����lיkF�NY�3�bĬ ���v��P����S��mȱ�f���UI �n����qv:�O��)_�+jn컌2�͘�q��6�-�.�2��*ni0���=�X��>�$�5���_�:��$�]��|֨�P���e��r+ `f��S�,tט9Z��ި��7����tv���j�^�U����/h��¼���*�ؔMf)��o]=Da8�X���#�+�n�/�jCI�#�w���X=��S>�?)�5�7��@;�$Q ��s-Z&�GH2�B���x�S�V;P%Pᙚ� +� �Oy�����m+�"9�E�q�����O�̍㚳۶#�ʒU�`n �
170 +�˺��]�{[� y�$T������_1�0`i�R}�$�J�( �T��8c���I�Ǿ.Ou���uK$[@0 &g�[Rr���٨�(�k�}q�6��Od�4{W4�冤oU]��~��Z�e2�z�Hg�) ����*%��?7=5�Jj��� R4��"ob�T [:�A� �'���h�6� Z��c��l��(5��,lz3�r�p8�Z"��,�����/�F���O,��p�I̘DŽx��Kc���+7����Q������J۪AQ�\3N���3߭*`�l�� ��f�&�Z6`�z�y�Y��u�0�c��G0N*�,e��۾`��p�{0Օ�{�Z ����j���j<��}��,_p6����U�` g��t���T���Iv��C�?�UtZ��6����i����K*7D��j���Y��=&�2�i$�� �a͜�G��Ձ0���Ǖ�������R�ɢ6Ud,��? ��U�o߹{t����[��j��!Q��Xd�A�,l��T�n�kO�� n�����yp�{l�H{X
171 +*�JS��0�-|��E�I�'Z���j�(F�� d.�Yͦ�&A+�yTVj���sfY��mucU�og �nד@�A⪔�?\���C%�c�3d�_=���l/UIEND�B`�PK
172 +���N���� � android-chrome-512x512.png�PNG
173 +
174 + IHDR�x�� IDATx^�}|\���w޻����4SbX�� B:I���! �%�@hI�H��$ZK�I�J�O��P�$���M1���ko���'�7ݝ���Io�Q$`��w�nggg�C���������������C�F܌�l…���JmL� �qlP��kȯmK���|���8`���sg��<b:��a*�{����i����7��q��x�CYY��eԿ��Ǹ��� ����5����+V�x�ז�F�F�F ��
175 +@� ��K/���<�=O��Bg����E�z���F�eVk]�������D�Q�RPV�����.t���'�@���́
176 + 9@@���f���ewFM� :f]|�ܣ.�� �G�c8��(�4ퟺ?���囶ѵ]�F�F�F �� ���˴�W?�U0/c�� �h��?P9���p���{}i�F��"XZ���f� �%FAK@Bz�Ċ+����R��6D��U�������N��,�F��?���Ĝ>"|�@�xm�� {"&�ݑ�����@ �x���"\\9o�F�
177 +���*����b�_jU�5�w[�J�꼓���Ds�>7�PDEf'���۫���@-��1�T������@�a���#V�.^����Z���k_�.�����>��}�gu4@��� �]��[�gʱi�յM�,�]�F�F`d!`+���_��|�!���y����v�5�b��腫r���J�� ȭy(En��Օ�gk�ն ����ί8�H ƍ� @�3E�E����yC�����%[��w1���.Hs��g����� ��f��Ȝ�<���E�^���� 1�n[���j���fk����[�2ʗܖ��O�� >���o���K�؛\E���w� ˿8N'�b�H�T 0��Q�S��f�&y�x�5��A�o�S���~�X1�#"�S]RG�>t�T�괓�뗂q.�1�k1�gW�5x�K��5%�o����� �%b�4D�*����!7���̃Q|��i�ahw>z�3�(�:����k�Ε�\�{��`u�pz��ե���r��]��=ޤ���Dž��0���&7V/�,���+q�����6�WtR���<u���5��uK6�m���ml[��:���+� `B���Jd*���o��%�hU�WY�*����ps�P�0xٚe /;�`�-������x���B �oT(ڰ����x���$r�E� `���_�|H< �����/��-��~ml[��Z��Aے��$��m����W'q���F�@���l��L��8�E�t�G��K���3��[y�{4w<���H�b4��1�S]Z��ht.}��2�U>��qLGRzA)u��+]����F�F�Rl Jp��=��@V���V��;Ax��m]�sC���|����(?�?�� �������m��督 ui��'��E����u�Y\�z$�޷� W�������ا/��6���ۄG�^9�?��B�V��^�y�2�7����/�(0�n����k�W#Tإ�2�f\G@N؝�м��F����7l �١���d�Eі����*��y�2�۾��;?�0�06�}�}�=�����K6����owh#`#�0�
178 +@�J�g�+s�F���&���_b�[�� �A��"w���� }��|�ڒ��%ξ��/����1N�ⳋ);mNIJ:�˞l��6Zx�ܓ '���Ύ�*�OV����]llF(������) ���{�>��= <A�k��ֿ�Ԋ*�^��~��p� ��X,^e���-m�o( ��;�"�������#�v�t��Һ?���Ջ*���ɑ��~��m�N��]\�N�Ʊ;���kl ��à��杢tUg����30��C� ~Z�_���^�I��x�[W�̨��rVI�o��+r��� �,��8� ե�?��x��s�η`��EQ�*�/��t$�����04�l-
179 +@e^��m������7�'�K���
180 +�f�\9�oS����%y�[L�����g���2!��� �_�6��M���\�y��E�N�t�.�I��Š����|ֹ�*\Q���F�F ��
181 +@���ݹg���H����q֌%�J��� _�'���
182 +3�����D�`�5�J�JC�y�nQy�B"^�V*/�&�х�K� G�}�,���.1���C�k��fNj"o���k^�,�ġ䒰�7F����S�1�!�/��EPP�����.�(� ,O�5(�v�D ��xw\~&�d�pLd�L�
183 +R����ۭ��^��)�M���rޱ��%���`Tz'N�-Ԩ��������r� �0�o=���C�nA�ܯ�J�� ���w���UK�oBfӢ��0��d�����'O����f.ˋ�6di�4��p
184 +���&��Dp2�`�m����x��^��E#m9��61B �
185 +������,��'�p��1�h3e+��� �V73��v�� �w�6����5�{#���ha.���ٵ��2�5F�J���t]_���g� ���*E�y�����z6�����L���Һ_�ڙiB��G,t�<������D0�
186 +@y���-0=Թ�Y_iD?�?�P��0���L蚻<��4��H� �s:�2�Չ�D�1��`����6��䟖'g����6�@L3l��s
187 +4�-���L��%k��P�6KB󇰇��*�ה�^�Y���/����Z��-��?3���'�^J��~S�j�c�I}m���|�fEhJ��{�� l�/F���8�y��b
188 +|>����,*ϻ �� ˜Y�JJ����e�%�%e��I�6c4�C�K4��u\���;�����8� Z��=��@(�FG���Nd��-�:Dy�!e��!`�8d1�uRx����FQ�G�R�*��m��5��hݾ��CW���#ؾ/,?u�N!��2p_�v�o<g����
189 +"�F�C����Z8�Aū�͚���`�j����������?'��M�U�%`�����?�p��[sE�n[ we�v#��?�����%D����-�`��?�����@��C�s�=�34?��(��&V���/��P�E�71hI��!|�*����JQy�w@���~��tk�ҡ�.\�;Wit;�E��)��gS��V(��`�ܵm��F0�A��F�e�n��V��b#`#�* �_y�,�W0C2��B�!T!ɖ�"��sp�K3v54Y��Ġ���U �l�֍!̿����m�`]I���v6���#58pj ���ב��⚋k=��,�TL&��8 -��C��e���J� �̿;w�f�=�y8ZU:�j���z�=`���Og�\�G�N2���D�W���H%��6v�6�F�R�4-C_DD?f+x�?A� D�c#+z���]c�툶�Ӆw�=������c,{�>���'��$'y���[T�)��=V�C}L��eϾ҇D��y���|�r�4��J�҆9!ɺ_��?'%����>" ˔vj��7�F3����i���;`���t��|a�j�Z�;~���lG^x�G��Lǟ@��eRJⴣ�|,%�;���)&�o_�_�Y��%��W�_��k�b�����g��� |�jy���U��rn�O��,�uӃj�J]�����W�v��">�n�,���=^CMjhZQEn9@�D*-�y�[_'�5���hZ�V�=I�&�+g�� ������@ˮ2��LXxw�Qʐ�?�9�/@�I�㞖�w��ez<����&�L �~���ai(�U���.N"��2XT$���������L�̟����\j�'�; �k��/����P@|G,)��ϸ�/E��,��ݿ� w�3�9�W#u�ڒM/��o�:���F ���˱����^�� ��)�N�c�������[���ܚ+kw��١[�i7�7�Z&�I]R�Z�6��P����^��̚P�Ym���k4&a� |�g���m���h�G�-9���7-$3���%���QQ��K��J'F����I��R����� !)�a����z�zl�֘0Ƿ��$ �(�n?e|��Z �[v# ~ $���\Ú�7os˛Ѱ�:'ӝ��30/aT�"�@TZ]R�6xx���Ν�|����v��v�u;����O��OqE�m \p�M�J֭�?X_��h��~�P� 1���C�'��
190 +8�?a�3�RT�F�2_E�p��v2�ʵ�7m�����H@���<�T&��f+��CZ?3���� ��ۣ= O��{sDz�~��@Ȳ\b����-��V�����˂�� $��YHr�WT�6��(�RT�'�r�Zbq"B���.i�7$A��\\��H1]K0G-) ���-�jC��
191 +W\��u�|�Us"p 3�t()����]�F ��F���:�og ���\aC{����xz���v���!�I����Lt������{tp�#% � Zw�
192 +&�.钪� �0|D�sUI���*u�+�Яl��i/A���tc��ʾs[P�w��X�1YR��-�) V�OL�`��YR|Gt/Yse����F�F�X�H�Vb����$g�%��; ~� �G��}i���U�g�QDr8Y�X'xt3��u� B�t1�8r�r��\�VE�Ɂ�K�O
193 +ա���� CI������P*<���uK��=�b�^2_c!0X��}��?�'��b�oaJC�k��~��d��4����4,Q����H�`k��#����C�3���f�&�Ê �*���,~
194 +�3��������"V?��A �V��zD͕ot���ū�Nf�����Bin]/���z�F�t �U���b+�Z �>sT��[�bET2���>+��h�����|麥 � {!�6#K�VC|��]$���O�-�.�+��� 6���{uS)�@)�Տ��frav�� {B鷸��xF�~�sCi7���m8)w�_ ����@J��BY#�Ā ���]Z�5*<� *�̻�a*�=oW�#��%ڃ�� )y�/�V�"�p(lԘ���#�zT��ڭD�meT�8�)�%���.�
195 +�
196 +]B��M ײ��ί*��[(�.Z]pL@�c�>�����e�a[$EnO���σ%�M�.��e�m��l����v�w�\py�m�ZO|�T�ڒM/ �/����pF��/�����aeL(e#�z>�C�Om�g׬���P"�[y�{���-�γ�!P泶������#I���2f�R{Y���ԉtY���H)�,1ʫJ�Z��*^��iM����2�ˑ�j΅`�X|lj�ʕv%�$3�5���Җ�]�����Ql�K���y_`�_��i��ه&��W�k��>R$# �������-|"QDx�3~�gBu�ZP�[��haD������ V��G�[�x|�҆[B�V��.^=�V�/3�"���l�lʘ�l�}O]z ��`U����*m��U���$"�(E��; �v5�K-<䢰�z�����>  EeI���C ���(}�.=�K�Z{yhd)E�� `��y�~UU�� ?~Х�b��y�g�n4���D|]UICe��U�-%hK�n!����?y[Z�Gb/ll��_�1�lm
197 +q.�T'<�Ю_W������,Q
198 +�
199 +�|E��j�0�It֏�I��ۚ��"A��%!�ߘ�ګ����J����ע�S� ����
200 +hE ���% �wt��s(�d� �H�W�6cbȥ����{���[��&��$�/"�����M�_
201 +������D@�h�X���+�~^g���s-tp��*
202 +}��@t���׆�p~e�L�"9Tϰ
203 +D�}fs�OC�_Һ��G�j��ݯ_�x���>?��*r�3�Ҩ��=P�.�~~U�3�E΁������ڃR�T�w��߇��T�G`��h�1Uj��ZZ�Q�r��lF"�)fV����� #X�גr3}Q�T-y��P�j�pAy~�/�2�=�}Fs÷CQD�?E9��>��.�U��6�E-�ȿ���,Ó� �QP���C�s��U����b:*��a�1�93;���l|��M� \F`����!7c�uG`����7���n`#0��LL�W�>�X����P[��&����P�U�-�YE+���=&����2w=�
204 +�a1dŠw|u���"4��$<�s�O��� ��?�ѡ��N����oQ!i�]߆$����6� ��CX���"�B��~ )I���2���;��cf���_4qŅ9z�ߢ������m���|f��+��h�_2pvԾ��E� ��)I� ��E��r�I��
205 +�,� _jf�5�w�2fQE�8-^�ÊY��,J)6 �}��=�:�ȥk�Ɋ\�r3�Kcr2��4r���IKN���kS���G�G}�n��i��4��i{�ݡ�0���y��.�+QR�<��?5�uZ]����-g)Z �E�r�
206 +�V�34YCiͽ����K� ��u�A߫)Բ[��Zw�Rר��J���:0c�o�ᚚY�� ��c� `� 7�E�y��EuM{�xeUI�<��+�&�4��4�g]�+(���m_���"Ob��rV����o%b
207 +J�s(� ��i*���_9�t��C�uSY�t����g]���u%�y��������M/y��h�k߾��;g�����+���'�������Q"���kU/��SL�� ��8y�vl��F��3�&��F+�v��5�VK�k='n�2�Lv}�X((++Ӷ���c�Z0 ��F'k�%�J6�!�mUT�w;š�n!�S�a�o��?��eS\��� �q���r������7{�G7��=Dl��nZL:�(C�`;�h�� �N
208 +��u�����#��
209 +�Ӄ0R��}����J���msa���&3y�e����� Wo���y)+��^v�yD���y��C3����1�ςd~,䇀v0��g}�s��|����(��|0�I/�!g�\ ,�q�7��|�aЗ���{%��U�^��, T�dF��P�]��Ե*`�.9���y��o���_��aĚ�n��� ��{�����L�B�� �wgq�H3�|j�G�J��P�#Eh�)�ʠ-����i�I��+��;ו<�m�ѭqIy��~�&|0�e-������4�MKs�5ZL�A�cW��L��w���Nר���ί|1I�kqr�H����FJ��.����"������ğ��D���D�'��Yv0�����0z�aŲ&'��X"��D𧽺G�!����A�G�G����p9��$�ө9�8�N8�!�E�,�Q]R�B��\X>�DMS7�{V��Ȧi�`�_=�j���`�F=a�$¯4��O�m�D�ހz�f���h�j�9r��0�;��)p�z���d�q��p��'�q���Y&y[�KJR��P��*�?�̫&��A�Wos���]� C�GD�C��p��·� ����_�7�z:Y1�xc��p���c�t�)�RЯDH1�e��uK$YRDKa!tW~�D�+}dLت�[��~s��w�@�T߫s�&�� �D��Y����v��A[ ��R�E+ jh�RAY�>&��D���@����u��MgI�K�j�\<�z���TwoU(J��w���߀�[C�p��~�^�^�wwww�6Ɓ�6�.���J��Sv5�U��:�.7\n\.�� 2:�Ј������&�t��ܟ��F$�ZE�y���<�A0�F���V͝I���FЙWH�3�]�t�}�s@�Wn�v�0_�*�ד���{�t8�1���>VA+���(��D��-g�l��x
210 +'�ܱ����4xM1���~�|��?�f/�����X�?��v������F�BP\N�i)�J���̖��G�����)E]G�+�>���`�+}�)�j.{�=�=כ��ٛ IDAT���g��DQQ~X��^&�n�ZRW�Dv-��#�0
211 +��Ӑ��������q�߀�X�Hd�S>C���]Qy�} ,��xX�<�}���g�-��}��څ�� v#�ؗ�@��'�8]N�oQ�)]�U���6�.�Ȼ�I�l���90: �sTc�s�Vl��I.(�^�7��*����Y���/n��\v��!��
212 +���.�N�ǟ<Y|>@W<.�L�~������m� f+.�ȿ����
213 +��@ ��y}�z��-_n��7���w��g�M\�I`@)0W�B�r���r����\��5�_�*w�����?��:�叔4�������to7=I����¼�t��jI�����y� ��
214 +@�"хw���ӈ4�R�\�aߞ#����XA�Z`��׃��_P�{#�?�,bƗ�^���w�0������|�h��Z��统 c�+I�[?z�(��7�������p�3�ĩ\Uk��Jȥ������� �o����ܗ��.�KE�屻O`��`�o&j�I:} yC�ҟru���K�INRT�w5��M�_~9�%��|����������C?�:!d �`�@������24~��/���(��A���v�sr��Y[�i���g�+555^iiO�N�t� �������F���#16
215 +� 7�.Xy�d]3�C�%�0=����(�� �u4{�����PT�_
216 +�}�a}����C�U/|��6� �ܚۈ�!+��L�0�boϘ�7?�Y�U��|�w��kwEL"s�P'�*����E�
217 +���=g�fH��_��/��6�qH�؍G<�K�_N3���? aX��|1�������g�oz�pNJ W�_�_eƌ�7}1� o�� ��߹6�@@�[��ĝ72h�7)/������55&y�޲�"� ���+��~z��MD_Mv�4�r)��������Nm�,�4�>w�+��/R��� K@�rA�D�f\Gl�HL{�
218 +���E����NL����&���ZN�K|>��j�섷Gqw!���=Dx��%�)��[w�G� V�=Aӵ��uPl���5!����k�o��52�;�&�:��g`7��.i�ͪ1�q�'�V��(�^o�|-+�Jc%x� E�n��}o+g^5a�"�\V8�4-���(��6�����%�� 4���Ao����333NLJN��iڨ��`� |�Q�i���ߓ�M>���$tת������jՀ�8��a�Ȓ�qb��J;K]͌�b��C �~k�|ӣK�w��t±��y�t�30-*�sk۳��DZ���Hs9])�2F��8x� �ø�ѥ�n�$б���ʞ�� `�eË�#pguI�ݖ�i4,�
219 +����ҿF
220 +�J��7���������\�˂(����h8,��=�H �BM������n�o@�]��!��>fZ�S�X�� o�������5�����o��m�K7� 4�������Ah�B�������c,� �p����y/�1�zܰ�S�����_�th W�(Q�
221 +�#�ᇏ.����YY��e��C���Í�0~�~��O���fO9��@0��Տ������ �{��w|���������O���b#00��n&)k�;��*�i:�!M�=���F-�����;���l,
222 +?�D�[,OzD��]W����0ŷ����(�T���
223 +dDs-���{<��o��Gm��xC@n����T����^���A��?Z����PH�"���9��Nӈ���� ����X�=F
224 +C���@`�)�VW�:O�]ό�)
225 +�&=�׋��޽�x�c�m)l�G@�r�G�y��5PaR��.& ���:�ݠ_F:kg�+�6�ZUҰ&��v5�C"0�K*�u����`���H�3�ׇ����o��#����p@` '�@�By��E9��b�ݩ:~^uͫBYly��?=�bf�9yx\�����6Y>y{�a���Td +�I_��W�0���>����ۗ�'Jwv[�a��(Y
226 +��I{Sv�Z����zfk,R�JH1���R 9����")fzХэ�ll������ ���:.X}� ��k�( '��8� ����/���b#`#<��'���d� ������b�w���� ��&�f�W��j��yf�����k�Z ��qǬֳn_�b��l�vo#���i<w��: u#'�������ݦ����,zv=��g���y�W≮}{���+j-ײM����t�j�C��gA|suI������@$�
227 +����/�b��#/0z0Pn���/�����F�F rH�(���p<Ɇ�h�յM�%����O�y�b�J0�ñ7Ҡ�|ti���%�;�mW���Fū�N�Q�:TL�y��s��ڷ� ��]�F l4]R!?@UO�}]�;�o{�êп�����J]S�N��|��e �X5���n�0�
228 +�@Tw�g��� ����[w��o;�Ew��w�c�42���g�� {��d�J]g��}�`y9fIk��o3!���'��M��}X����e�wY�v�)hO��6�ݴr[k4 W�Mv9��ӥ`^Û��$�� Mݼaɦ��ήg#0�S�hM��ی4�[�CR hn��\�إ��L| M� ���Os�^��ft8��]U׼� w~��Gjd\�%��ɡ �~Wg���.�#0p����`���&��n���>�Y�[�ۀ"��o9�5�̓���r�����{�����������!V���V
229 +l((�`%A��( ��m����D(-��g@��f����rfΖ�HGH*qMis��K VA�9]�n�2��u��@��Fv��B l`I�,w�>9����rh�f �5M��KXcH��i Ne�{bn]��ff��N&��I��:��ݕ��rt6G��C�������Er 8��wwW��g�A�C��^lI
230 +c�濓���m�8䷾�o�~�(������rȋ" S!��[�9� �/��Sq�W!�kI0�����v� �X{৕�O��Io>W��3��r�h?�,f�!
231 +,N�sй��е���=8v��M`Ѕ���d��H@;��L�s$��2��!+�> ;5`���.�o��0x��v�Zy][>��t�]�O�j1X��|�������&�9p?�-~��m���]p%���N� ��_��ñ���S��B�����7qP�� �Xl�ADv�`�kڦ4����Vn�K����vM�N��������[}N��5W�vE1��~��F^x��Gq�5����p6���e�(�2� DZ�~��.�׿{r�����{w~��~�ﮞ��b򷿤�o���y1������%��r��n�b`�O# � >� �ۗ�/GD_b(e*}�Ӓ`({υ���`�)�#���6~��6��g�w��@
232 + � U�(՗��ljqK����(�aw;�T(+��nΩ358��@1��k�9?F�52Р��Q��" ��U��'��$�WNe�: Ya+��-���x�ׄ�Nr!)9��IHJIFrJ�y����0��=>xD)��Q�����{�������; �����7r�lo��1�Z���ѕ:ޡ�3@����8�ش���)���z�B��Je�􉝮 ���4�M�ߕ�雰�k�����c��*B���g�1F�o�W��=/ ��٫��xZ����ǯ�Y���3���4*���g`)�|�E������\N��� 95)�a�l���b ��i��ݽ���5��`���m%f!�U@ ��J�[�s���ŴhUAf@S��|w�t��b!<Zg�c����Cl��r&`۶Lw��W64G�Ɓ��f� �D-d��аGs��z�Nm��,j��;>|:���f�;� 9�j$� E�gR�����>{Om�`OWMͬ/d�� 0ϰE`\�C]����n���"%-���[��hX��n)�R`*ݢ�����$�
233 +�Ӂ8!��`M�@�SD��N�y�/u��\z����n�D8�l���?�P��Z���!l!�f4��q�ﯰ�����jn�ϩ̀�y :ħ<0�n�/�� ��i"���m�������,ZU� �j�I��]1"�;��� �U��������6� � ߷����/e�R��FX���� ��w�'��t�e��7}��Kb! V�:��хΎ.��Q*�O�$֌�*�"�~����QFVꉺ��*�x�^#x�QN��{��Mۣ�N����X�4���@�4��'a݃ta�-0��t��1����P� @���Ay�ߒ��#"��q��a�}д'����o[���oe�{�L��W+e��?�!�2Ģǁp<��aO��iiH�HCjZ�zg�Ⴠ8�u���ݝ]���8�S`�7}���ڛ��6��tfı�K��I~�����X�RaCL�ʚд��� f�{c����D��K�V�F��n�TXt�)�n�fǥy,�U�n�z�AU�x֣TcK�G)~�v��1�� y.�n0pӗ$*���C�.# ;���4-]�ݐpVa64T�C�v����$�σ�ߗ�S���� W͚�kc�<&��rN? 0��*�K�Ύa @Du��ʶ�j �H���ù�A���y�X�F����Y�|6���w��u&�/Mt�d��53�^��2�2������Dp�^�+g#a��T(�@g{��:L΂��x�9�2��������4�5�x� �G����k�D���_��iҫA���쨃�������[���8jq\��A8@�Иnor1.�w��W�;;; �24�JH��
234 +\��o���Ldfg�7��م1�a2Z������m�m}��L �H+b)3`SS�� ^���u��ű��_�pAR��� *>`�M���]�|�H�w�4�� V����X��D7a��h�HHj߁�_Hw����c���:7"�cwb)�= �@����%!I�W�gq��g�= Hb����eU�7=�\(�o�����UL�&EiS~�ʙ-u��"�!J���nPT�]J���_v� �|����֞pI}~1�;
235 +٣�M�>��D
236 +O�Ǵ������s/��HQ$7�X�" ���܂�Ȧ��ƃs�X�{�I�bF���D �}o���^���Q��vP�+���?��sL��[[[����Z�\&����LǨ��L3���ϣ�Y��C@��Z���Ԃ���y���ቖ|�223����{h���0����Y��%��ѩ�`ռV��nQ+ |H�-ե���� vLJE�@ @E�:�K⟠�W�����Օ0��r#��1H�L��w�Zi�R��@SS3Z[̤F#�Ht@rr2��Ӣ�p3+f�gZ@Ņӟ����?*�)0�"��w�m�PMui��`�K 8@(�ȓ��/�������4â�
237 +��<�s21v��}_��.6�D` �@�͍-fzlq�E��7@���@�[���������/빰"�<�|V��=�NM��?�w\X?����~*�y�7��
238 +Cy���M��E���,�?�<��2F9��e�:��5M��y����d$�� LJ2q�Ta��h���j�3�K(�ŷ�(_ �Z�hɦ�"���O���s�q�g�M|֔/���vtuƷ�_�q�ƙ_2���F|��-U"" �+ ~� hmnEwg�^��D���dȐ)�b j&Lf�I��ƣ�6�O� +�~��mlm:�w4���.���p�7�0���\D�0?%< P���I��� {t�y��B�Dظ���G`@*balnj1� ��U�L���FFFF��![xPA��?a���!o�=�34??`���h�)Vׯ_��&�;z�Ip`@y�dëc”D�C�����-�IX�ī�qHJv�q���?�w�-��,h(�����fZ-�&�U�ϩ駓�Z"-��@?�ⵞ�����/)~�v�� ���aFo�����_��o׉,(�ܻ��L_Nd�|����xs�����#=3͌7���nh���" ʶ(ߞ�>����ᖐH�y�H�A��� ��\�/3v54œ�_vKQE���X
239 + i�ç����b��0���-�X���G࠹V��W���� ���q���ۿ���7~�$�$ ��1���5l��E�������T�`h8��/�����9��1+^�`�Sk�ֶNjßlf���<I����р����}V��_�)�c�Q>����� ����ID> ����0b��~�
240 +k�؉cM�^��e���bUl!�@` r@uw���Y�: 4�á��_�k�_�Aȃ�%C]#���kP?�����19�W�k����߿���<����x�� ����HÅ�r�* t��N!��}�:bjlnj6�~���/d>��N4��͘�C">�iۍm��l����cZښۆ����Q����+��ߝ��{��6��iq
241 +.H��(�D{M��l�u���Һ�X�0��=�qtn����-"���34!�. M����\vN�̘��hZB�7�?��-@@sy�'Aalmi�~Arjj���g��g����7n�K�H�u`\���|
242 +a<�*��r� ��=�A8�t�my��d�VƏA���(������F���F��IS&B�؎~�kl�b��p HzbQ�v7���b�� �H����Z���kW >�G�S�zἁ5�l�ߡ��H�<�y��3j���,|���ZZ�rn�KC.�V����d�P��oin��닙�_���&aԘQvƾ0��n2�0I�<�bX��%��D$p-�-fܓp?���[b��P��ٮ�=Ys��-g�d-�ϡ��%J�K�7&�:'��*2�%��[������ap!@��1W�� �o�B���x�DL�4N��)E~3�����Hގ֦V�"~<�
243 +�1a����1۶}PS�����9�tW�����N�Y��y��j���
244 +_���J���ܱ?�0�\�p
245 +'0�������A@+3v����F�l�H�R�c�i<fӱg�;�֖Vtww�$㟰��7S�M��m5�F��E����Hq�!-)ɮ8u4ҠX���׍NO;������=� xzz�xZ��� \v��&���⬯]�|GF�,ZU��Q���m�0=F����ˊ�u�n�wԁ�8,!)fO �x���^ØD��)�d"]cb(�� ��A�T ���Ln_sq�'�AKV���hKMs;S}�kJ�0a"3f�D�O��;�H�_SSSL����?+'SgN�����LFN��J���L�I��/
246 +�+J�bT~�����64u�Fs�n��~n�ڵ�A@y{{<h����v�  =�bT�^��k�i�ڭwѪ�fz�<f�'�pT\=���_�Q�?^W�\G"��p�9t ��/++���T��W�� h')�/�q�`�������b��_q��>k��o$]s ;u4&f����Hq�é�)D�Fr�w{:��ӄ�-��k�H�ў�~Hn�G���ք%b�+�^Mi��-��-� ���ss���—A8 y��?-� �Fׯ-�{2���
247 +��R�����ܙ^������Y;Ai|6gH=�T��G��v�:&O�l����d>r��u&eOEfJ�y���-]���i ��~js��0G@�yGAyHL�����ٸzW㐖�AV�:���<&��4�=�w�ƊDc�(z���[��>��u"G<��
248 +����bu���lp:`���RW�4���H�����٦�$��'9S0e�L1j&R�&J�{[�:z[�����Q�{a�c7���/��E h��H@E�C�PE^�@����Ce,,��J�3�P�'�\0�"1�����SP����6��r�(�����L��?���$�h�p6�B�R��4Z��/�\Jj
249 +f=�L2R���= ��m��(�.~o�x;۶F�K��a��$�� I�D�D� IDAT$X����mw���6?px�@y�:�?c���D(�N�Y�b��/ ��]�LN�<öaLf�4I(`uQ<ޔ�X�<Ia��z󛚚S� �s8t��8G̐��#�LȚ��Ɵ��T�%�¬��ӂ�>~��M����i� �b�5���/ OVZ#d;�PP��d�s�o�!���̪�c����( ��q�0�c��=!O��ln]W�ܶ�;�D ��T�0� ����ֶ]]]s������>��)ɘy� �e��ۿ����p"&fO�8F��s����xik�:h��! N�]{�v�I0��|jA|�f8�o�Q���)
250 +j阩�Ҁ���,�� � d~Oj�o^��aS��>��Mh``uθz�C�R�V�����豣1mִ��/f���C�;zJ�?����ע�sװ�0�=]=�(���6tw�X�<4�!%%�>+3�t�>�����(���=�A��� �2A�}F���+l�ߡ�ȷNx@�j;�<�d�[B�'b�3.�f��/o�z���'�� �SMr�hy
251 +���!^��.ZC��#���� �{����n&Jk���T�ii���B�Xh��HýFݿ����a0�a7��W�\6yR���,�V')9 G;kD���gM�1>k��E�x�=�}���,!Q��t��-@`o���V�t�&�5��t -5�t06Ӈ'ni#�Q
252 +Ъ�Wս���ޒ'���|�:�GL�j�R�R1�3�B>�#������GCB�]����-���r�T�E���c����M{�2 �?'B��jj*����;�D�3ѝ�l�O�G�� ��_5�B���x+Qb�3�3q� �3R �SOÔ�Є�7�EL�o�x[v��|T���@(�p�F�N���&D��|ψ ==N�%/��@z��>0�Xǝ�q��^�� �"5��O�+�MYF���b��hb�3��p�9��L����ք@���i ^��لy��{#^�-��XHx�G�ʐ�p11�FRR����(�E}�� �W�Ʒ=V�7$�.q�@�+ˏ�����3Fj�ˉIS'a�$K Q�O8����a|�5�.r�p��n��p�nc" r�7�nB{K;|>_B�'S �̀�:��UKO�����HI�����6���*9�qBC ��ӯ����Z�-�ӏ��������BqX�ѯ �E,�Z?�K�'����c���$k����M�8W����˽��Q�|So��c����W�O��n+��w�c�?�dK��bJ!�A���I�ӆ��������M��}�� �]�H��������I=�%�z��<�U�L��J����!��2h�w���O$ �2�M.=# �?;ے�/���pH�p���:/�x��籵�]� 0T����E���{v�AKS+�O �9��4333.��d�^#�+�����?�>l �\1;M%u�
253 +`��KxN�:f�������Y& `dn��
254 +`���B{OK\cb ���/�8�5@�xO,����̬�+M����X�;i��b���VN�f�0�)�8�.���7y��\�J��:�'���4�'�^�.O;���Ǣ7���G@� w�u`��=�Ӏ<�sP$Dp(�Ø�$��I��^Z/$?vln@�C��Vr�N��д?�h�B<��I7)���s����8y53*�����v��ww�6T���6�" �vn�i��w⠤�$deg�<)�Lx��� �ٰ��݃jW�kl ��� S&`�K�$�M�q���l��
255 +���N���u������b#`B�{�n�����M% +�� ���h��������?K��b-�1���������i��
256 +p��!�.G�"|/���
257 +���V�dW�: ~�$ y�C ^���FvNv�,^ ��
258 +��o�� “�VB�M���Mkf�K�٦`|���T;�>���-f�3���'� �g�@Q�9@Ȃ"d �w�vf~� �������6�_�6c���
259 +�
260 +�i��{,�>8�>ɲ�8:|��~͓��\~�F��]͍����~�`K�x���&�]>A`t�89�x�N��������݈�>l@�m���Z��m[��q��">J9�9�x
261 +�]�u ��І�67��m�����
262 +�y؏��:�35��Kep�ӏ��Y���T�YDfX�����2(P9�M?������F�0 K�!a��Ǝ�̣g �a�zT�ؽJ�< �[��M��������
263 +����@D�P���wc�]�s@���@��"F1��!�FC�i)�����0PL�&�?8t�s�F���uH���:��S>�`$�����Ecc�eZ�d����#g��þMZR&��9
264 +����H�0[����ࣦ-x{�kP*~oZ��ɮ7�������h�*�J��*��䄢���8��͌[}J=f����{��DM(,,�Q���oϘ���@�Uf�`B�������iR���H4�����1�X�J��4#|�d���~r��Ӿ6����=6�6q����;;�������V p:1z������ �}�J������q;�&nw_��� &��� 2�/���,Qɜc� �XFVf��ȯ�0�1-)�2'C�ғ���L6����AGo��v��s'�<�{J��"��7M?u�(��V����z����hmn�[��9`츱��~E@�K Z��GM������-X���P\�wt��]���΋��"!9�w��m)kWzf�?���-�p�x��q��1��J��G��=;�_D�����?���G���|V˙O��i�P �:v'9�TΛ��*f�w��
265 +�^���pK$���;!��U��x��p'��dc���861A`�= [���w�~�X�j�����c�ti�?���3���ٯV�X����0�)�C�A ��Y�i�2��q��~�_t����z�#��z��);~L����>�T'�@�@��=��q����ph��?�L�����2�@����*sg��B����e��?�UScz{{-s�����Y�HԢ]ll��*������qCț������ʏ�Gm�b�@H
266 +��� ��N�`�r�C���Yz��������Ru������������HG�&���}́x�ո��V ���gV~����g���!�0��ܩ�A?p.3����C4;::�h:-T�`��#0z�����F ��TП^V���n���[��&����#�|yݪm�
267 +��]m#�p�ܹ�O��@�|�jgn�]�hkk�� H�;t�?�gٔ�V��=F|"`'�:���s�d|뵷�0�Q>ДV����sg�RY�������9��`������-�q<���-UijV�f�x,$A�]lF"v:�ï�����{&qP�)"zWs�;O���¸>��=�An�n?e|����9�r��pb�ߵk�����"�� +'*GVN��F d����qĨ�е�)�B�֎W���B�1�J���3���P�r���m�Ƕ��zk(�Ȼ��A�������؈^���%3��I�1e��8E��F zd�����s0:-��8�)��ӎ�{���M&�=������?@gG�)> x�׭�?���-�] ((+pLH�<�(8�T���۽���=#�鐇zqy^>�� ��.Q�0��Nq��� 95G{$RR�c0k{H��!0m�Q�5�8���%(�E��7��/�����E"���tuvA�t0�[=]��vŇ�8�+"���8>�6f+R_s�ā]��%e�p �ն���*�zv�믨{?"�'@'WT\��������{��UVk��ڧN�eR ]��j�P����k���XB"�x��$!�"�x�����
268 +�)!�d2��3�̜9������A���Sv9���&d�۞���]�z�z�a�q���(��3`�n��:DN����b�/� �K���f ��<���C��ڮ"� �(� �:�ÄMQ�7���:f�n�ޓu��)u�>WQ�O1c�k�P��1(\YH� �0�!0������/no���(yL�{��q��;�1�i<,72����1�P@8B����y���ɶ.N�����y>g�"T��8F��ķ(�e}��8ж�j�;2D�!K*m��O���Owu�:#�5��_�E��D��T��`��a���G���_S�j��
269 +��͋?C���(��
270 +7���@2TɴUP\��sj��L�D2 y��醀�����\c,_���b�.�+�V$*��������@D�F�������Q;��[�ֲ��@��G���2�a^P@?o�w?�}}jfK<�p�=��x�ј�X�3���� ���D̘=E����i�A�h��/
271 +@�Q
272 +��M�׸�jf�� ��-�^%VnL�xv?��θ$+1#�����[VU#����-^�u�K ���;KEK���͋���:կ-$�����h�����,̙?� 8� ��(� ��X��jC�)���:���\�(����7C|,��L�/"��f45a�Ndy�zm(�u �=?M���^��u���cO<����`�GG���B�
273 +���G��3`Y�?�޶vN'���� Q�?� $[��~��%�u�jk'�c�4DS�%�B��R�ΰ�ݿgc��C/�i}��k��V��z�'rY���a�/o�eͼ�1���
274 +��͋�2�9qܟ�؝��IV�@��h�X���Sf�,��8�2sK�@m�<�=�_�B�|�vt ��d��@���[�(��-� =�}}ψE�u�n\�y��\��>�ߋ#!~In%Ɲ�ܴ{s*7��c[�Y�gb,M���D�5����>Q��zf5|�cD�$g�N��#P�[�S��FNz��^B�Ql����\��[��@K����@�FFطת������]D�4�l�r���¼���6��KR��q\���I2�I�8Jv@�9&#��%����yqHE��4@Y^ �$� @k�oؙ�0�Әz�{��ԆѠUB�)B���4��o���d5�˕�.(q��k�4���d?h�S��xN�_#�[H�z���Z6~�9�Y�5��5()/1$N:�:�9L
275 +�ڢy���fN��X�D�x�~;z�;c)n�2�������zA�H�n�xխO���g�>A6�ܫ��Y0���ҡ������͓>l��}�i�yD���q�M0X���:ۖ�� �y�� A�\��9J��as��B<��L���$%!���K�ߋM� � G��ޅ�n�Ǎ�h:� P@���?��a����� �y�V��y9���7�!IX����������s�n��i~��k/;6u���%�����h�@���@umr�r%��K��]��8�fH�u�DL������<���Ul����/V���>D"���U�۲�޿���ꞥsT��a�� ����H���eO|~�-��޹���9]�e�՚���(����PX�% c� ��x؉��1��d�?�0�
276 + �e�f�J@fv�����������IN�HTb y�Cx��t ����!% �gNT�1����޸}S���̠�7-YH.m��ج5�@S.ݺfGG*���*�6.ˍ*��p 3��CP��� Iʀ^" ��aR����&�i`������>�P(/��y ��(� �f�L,���|TΨԳJ��#����V�Bu�,] �g���h,���7��w8�`��X����ځ�~sN���f��am���tՏ�*��>h���?��8�����P���,�0�1� ������ �7��5i�-�p���[B.�Eii��˷��2�A7l����Nw��tx]�JU��XC)����?clt�,Mӌ�=�"**-�I��3���@Ne�:�:��D��V�"�F �%K`T���ͽuh ~�4
277 +�)�#l��-� Aœ- ����������(�� Z�iY����-p� 5������q�Vm/'<�.|����v=3�x�2*�����
278 +^"гn���Ck�$
279 +�u]�~���㣡Ә��Ok\TR�G�o�$r�A �p)n�e�<����H�e����[���CC�����}#)f���k���v� Y#�0�!hw ��������:)�[�P��E�Y��D�Q&j�sB� <;� �%�/J��@'�G�g��ƃX� 4��������x�O+p=Y����$�M/�J��q3��4]$*���Y�YN�@�g��@2k@~F
280 +�J��ρ���-.� &�sU-���xdL����B�H�� 8����8�u�8"�������w7$�Icݺu���g�]��� ���1�/0���Υ8��#���uc��ѓ*2PQBA���|%�3��}J����!^�3 �����}F$�X�v�\�#��#V!6���AYU�� (9qHEd�O�f"ӟ�4o��i���� 1Dp���2��/�ݝ=�j��x�I��4��#Q߯�n���.���� 2�*Xq�@�� �|���߹.��֭kw=n�3�NJ��Ĥ^�?zk�I��p�s� ��]�;~��{�_�s<;��vCY.����B}��Ϥ�DL��=�����r=D�Q�S��@�" ��tw�����]�2=�1n/��|v���&EZ�|ݩ^w^V���.d�ʘ1����̏���Ou�Dx&���TJ4i`��~�8��.a(<@`�X#
281 +@TT�
282 +���kP�?���;�]�ݔ�Kn(-��{3�.���'�y �% �Q���S��@*! b���G�8�pE螧���+dc���.,�I��"ّ�+�<�\-�r�J���q6�d�O<K� � [W��O%V+;e`b��-sWcG�gZ%��p���i*�{}�]�7q�c��䦚sHQ��eV�
283 +L�!�����`�q�w�c�c:G@oW��<'�@tg^^��ii����4MC��Ά�T*
284 +�x.3�Q-�|��)M4!��nM���5ϥTxJ�
285 +�����K�V~�@_ ��-s�������r��f��q;a�Y/N7���p�6�a00h*۩ࣸ����vgee��PU�B�X �,���5Vpۣ7��/[���V
286 +��5��^EY���(��d���!\y�����0A+M���! ��=���)B�$����l��n3���� ��x0����Ol�c�;;��� �,^[q��V�jn��O�8�桤��Y�N���׳S�A`� ɂ�:${`Ԩy��p�\�����J�3��U]7��+϶��šv
287 +�Lⲵ�Q�_#�`") �q����,�W� t�R酊 ������?# �a
288 +���3�)���#;'>�/�Y�Q�����ȍ;�H�u7-�k*��
289 +]K�Z0$��r8H:aa,(.��X�X����N8�r���T� � 03�i
290 +]h �����|���ׯ�s2��U��TS�!��0=W��&W�r ru��L�>8�ߩ�A����GsC �Z�LI���X�&�����k^ ��g�۞�
291 +�������h�0 ��bؒ"|�Ue���՝�ɶf�:�rp� ��� �-��
292 +˥�Dk=<���ݶvO���Cg���+kk��`~�f���}(*)BQi!���jw�8�0c�!�6��yL�
293 +����l ��Ǣ
294 +֥�߉���U�����\Wx0��{�ke(�1�VZ�� ����%�ʳ���A�xF�G�p���L��_���L3�1����ߤ�w���S7��v~v�)̠����5#_�UY����A|���``�
295 +��']O�t��V���o�Oڒ󀃀����3����� Q�C%@���*@�~���~�bL'[��M����H�`����c��@$"� �-��`~�*� a��888�p���:I��"��t���X�* �����/����L��h{�(+7] ® IDAT/yk�g@��%�%:�;�oll ��-�Y0ii(�(EaI��UЌ7�i�A��HҠ�����5׏���!ʜZy� %�������i��5���fR^X�e������ �(9N8n�)r �������A��鍀8����!ʀ�����ܼ\�2`!��G~���?V������p��E"� 墣)�e�Mj���B![YĠ!� ,,.t����� �A��D#Qtwv��p����C`Vv��,sU�*�����߶/mN��_Ť6DSW��j�♊�W�q%U xc�7mW%�+ր�|����o�88L_B��#W=}�� ��������&�C���?�h�{���C뷛k1���SJ�j��%�&�= d��K�+J�xh\w ��eؚ�ZQ\
296 +��[J
297 +�R�y�A�A �`m�*�� �%�M �����ƒ�r�<��{x�����AO⤥��� g���"Ƨ�\�c9�ł����c `/%@^2Ѷ� �P\�Xb�{���@* �Fu���zs��a�99�<'� kL�4��}�ǻc�8`����M�h��Oڒ��]F
298 +��Aȍ��,�D ����A�7�6B�#�PVy$R��i���q4�5"�0m�Bd&גr 7@��n�7�qjܶv���;�6l�\�i�g�M��Mԩ��J@8���)��A����5��� p>� �*`puo�-�f�D,�d�$�4 �k�G"��2*+�S��gܖ
299 +����[H!��
300 +h%�GC����uK@8���!Hn��x��ͱ�m��:ď�\APKck���X�F����� r�0��Ĭ=�E�B�z�c���]����v
301 +�՛�E���q �����Dt��s��cy'��PT*�i�T�qp�G�6`����'<OAc�\q){z�MO|g��Цel�T&�V
302 +��M .aR� �3��6+�Q�5�"8ԯ�(��;-= ��%((.0�3׎�9}v�-�� �AfE6�u%��o.�a0=��&����R�g��Y��m'����BX�n�r��/W�q �S� ���I� a �E�wb�E,(��E!0)D�
303 +����A`Z ����v�5��+@���H��,�f��"�*�P��j��>S��h�+���gl<���%�&��/5M�#�/�Vo�Pt
304 +�`IY1���Ѝn�����@N��7�10ǂ9����7Yr� �`<ͤ�]Q<����6'�?��`i`��i��+��Y:��gI��s��:�#ր���7��Xo�)��������?]��or٩i*�Z��8ƣ!DՈ�����7k�uo�A(�� ����S�[� 2�*���.�ր���[�������+�*��[�鍆�Ч (O䠓U�ܩ�c�hpb��H��d�**)D^a��a��It).�{3����LҼ�����7~���Il 0k�X��E��?E04���A � `<b����O���
305 +S�twtC3�����4�t H�!f�¯���I��� |�u��������$۴�p��福�|��@z?ۈ��H�`04��&^���B�i�u@~a>���ε@��N�|�/yE��(�7~�' >��W��O& ��Fuk@(:�P8���~�{�?ҭ+
306 +�8ȷ���C5�g��4�?�� ?�a��~�Y��;��h綵{����d�, �)�m��W�C 5`3���8~b 'A���x��<#;�����MF�n�]L��Yi�(�*EAF1���� �]�Q�)��!LJ14@�P;��:tk�#����6�6��e��@J�����ӷ��c�7v-ZJ���Pڙ
307 +��x��P$�5��u%@,v��?�n (ȇ߱$e��/qN�~��{�u�~2DcUW�Gz�9Ќ��.����鉀$<�@a
308 +4�2��G2#ޯ>���<��i8��Q�/_�J_�6Ce������\�� �u%`� 7��X(+' �E���v�q#z�"�ŨȫAaV�}�2�'�y����}� -�GE �ڰ���4j2��P��~0]�솦�6�϶]��p���
309 +��� ܨ'�I �$B�����ꇇ�Ne��e���nFf:
310 +� u�������?���ICIv*�g ?�(!��XP �3܁��C�9���h�2�n* �����`<�������aOs� ׀%��/�V�� ���(]+�ԃ�p3�^S5 YE硆� �j�a&���X��[��N8==��ۑ�!���Bu�,��� ݗ�4s�d{%�W���ԕUs2�N�TyN8�6@�L�Tʦ�
311 +k��vlj�{�`j�q����_nt�B�K��V����d7 ��+������Gkz��wǫ.][^V.ѧ,�i�1�ݕp��l��q�B-�����gcF�<T���627���'��_G�`�� xr�R� q^n�o��%D�p!XÏwll�7�۞� ���ؼ�����N��˛� ��D\O�K :L.��=�]����'5_-[5ï�k�| ��(&�v�hRH� Я
312 +���Î�9��*���|����W ؋C]��{��Q�ق�e���&X8
313 +����k�����4�ޔᚪ����(�nӿЪu����T�9"ϡGo�snͥk*� �� \z4�A�)� �F�+� ΀�4�<�8xJ,���P]0[�緲�{p��=B� ��L%�o�-��@��x㎻[����95�����N�����W�%�"�N !��_a�3.�J��o%��Kn�]D��0]`�"�XB�i��O ;7 G������7�h斞n9����{�o����Q�1p:�e�Z����a3#L��G����l9<�p7c��)b�'Dnc�E��F4��eR\բ��]���d1S-���l�\��b����5@8�(��ȇ��L[af�N�o�8�gT�� _��r,4�ġ�� K.G� �]�hnh�M�A��ٻ�`B�ӪIS>ϫ�-�D?�b� ��!����=�y������Dž7�*�h��i�r��XL��x�+�b A�\ �ν!�Ύl�/gV]���R(��i|�x�� ��km��hB�I.'��).����Fzf8F��F�ص���>�ٯ��l.Wݻ��4e-1�h)����*�K�_?�z��� �e7�8[S��5�1ˎ��
314 +���֭-0]��*rJ�٘Yt�iq��.`q
315 +<к�`��/�6*� �ɂ$_��B� |{dž�MƷ=}Z4\��^�EL�]�������N�g�鿘"��q����KŠ�"���@�ݬz�@F�K��̂ӑ8('-�Ͼi� ���9o�u]p��u=à#� l8؈��~S� 셦\�cSS��@��Q�\�aA������ΆE�x�'4�����;�Я�>\���,�*�.e�j��R�&��߇��"���N�̂B�{V��̟ q����a����t�v��)���/�fӬ2��w��d��v�$�*��-sWFC��\8�>&�1ɇ���+� ���_��du�D�~`umID�|D����3�O��[��+��p���!N�,.ϻ�6^�'�X�_�Xر� �T��n8Ԉ�S�Qf���z?��;�SS+��P�ӛ�E4�s��i�� D h"RV�?���MV����e���3�/��@�4;�{���K 3;�eEzz�T<���,�o�����I�W����:�����������14�c��wnh�}|�pJ C��6/8_��=����&afR��1+�ܺf����7 ��\V��V�<Ӑ��a�()/AQI�N),�r�&n�KO�0����w��-ϣ��5�jS��8HF�ƺ&��"l�̖붯w�%z�����������{�ٍ2�~~�մ_�l�~3:w��,�<]q���QAk��g�r���B%e���S�/�$���|_ʜ�'����ov���c���=�Q���ЊѠ��?,W�Q�E����I�)Wn��D��KD�v��>�j�@x��l�\�v����V`��/��YU���ƟaM�-�<�$�������R=d��J��3��GM�\ӳ�%z=����r��Б郀�V�(��uQf�ׯ��>r_"�)+�Yx:�� _i&a�u�1��������~)K1�V#sA��p8��H��ѱQ��&$�cF �\���/�O %@L���Y�)e����w�5��I�·_QӬ�I���>�wK���������0`��EC<|�_b(7?�z�S&���&�?~���\�����d�>)��(H���d�D"�R� ��Eum�� �؜9�����3����b!�܏��7N������H�MuM�3'"���ŭ��۶ &�*��M���)Wݳ�"� :�����q&��G��o��g]����s=�Ѭ �>��t ��wv����xhcccf$� q%@�%b��R�]� g e����؏�Ѐ]���w�����Ԋ��}�_����=�nB�1f�b�)W߳�R"�.f�f &�0��[�ܰ��MHS�8YT �'>G!����U��rM� 1<<�[D1��x<nTϬ�� ��Es��?B��")�%?�P;2�0�
316 +���y�E�_�Ĭ;��k7-\�nhab�~�Z$���Έ>f6���{��'tÖ˼�����
317 +0�A3�R�l��p�-k����[��*�C��$��sJNO��F�����r�Б釀nh4%"ļ���?ܾ�1!��͚=9��-�F�~�p4�d�fQ�'�4@�˯��)��W���'#�Tv ���ܲ��x�>b�1f�[o���Am����Ǘ��Z�J��3���T*�b 1��;�KD�(�`'���Y���`���=�� �R�s�j�J1��A <Fá�L�.ҋ�>����;�9��B� 4� >@910�H(7��#�?E�)_��1�Q�v����>�|fˢ���5�!YQ�T�/�������!t��?�\�ut���j@qF"������148�P�>���T�V����6��(��X��������8 �����lM��}:���Go�R�9��� -��=!r]�v��'�ԍ�f�0�-�y�y���@g���x��<M���ox��ߗP���M >�(ʏ�Q��#�{�{����r���pi�ef����_"��"`�+�(�,��� ���v)��SVG�u�s��S��>ʦ�u{����L_6��t��~��#̖����"c �`$4��р�� m$��&B=�u���S~��-<*mT��;ɍ���$@��ፏ|uww�֐�
318 +�5����A�6�>����.�i�/V�������g�j��8%���А}��A�$B3��Z� }=g�"T�צ�0ËM{��@� 2KP�]���L�9j�=b�}����[��G����bp�=Ý�lӣ(���*� ��H8b�H�PЖy��^�=���KA�&B 񰝍�kV��?�v��D�n���΋3�;r9@w'�Þ��j����n�ni7�ݱ(++��#�/\ �6.���"`��5�0��ϲt�����1�P8� }� ������,>����N�!'����(ͭB�7S�W�O 7�������@��F�4C�*��@� Z[02d<�*3����:1Њ�K/&V
319 +�@"‚� �4Z��6��Ptͦ%gh�~H���Rص���;�����bÂ3�t4���FH���7D>Fc�c@4�RY3��n^af�2B#lE�MaN�8�쬔UG����o���$�O�ֲ���->e�Up)]�e�?^����+���aH����z[�ZV�*����� =6X�{T����������- >Κr� ����1����q{\�8F+/Ȫ<���I��!��V=[Z�ݲ,%+7/�(3��n�?����y��}�<H�Bdu�� (*.Œ95�� � ����Y��<]��x��E ��%���B��L��Ae~-|'t�wN�(D�j�=���6������m�m5>Up�+������j9����,K�&���E4�)n��~qӮ��Tb��s���|���lj�<x[� ~HQ�g��{:�;O��g��������D�����+�+r+�(EeM\�x����?���(��y��,�lR�: 8n���βKq�w�3�� �.�;�'���Cc Q5���f�~]�[������\߄�^���S��o}��6�h������7��7������cU=���7]�l�����I��u���>N��� �l��H'i�����U��j�ߊ{}��k� �� V�-+J�XD�z>��˫�QVQj9%@!.=�rx\����^^o{��msJ�����4�qsF���_Q�S,�Z�#�8�uº(��UE �m��h��C� F��钧657���|�r�wi멤)w�py�ǂ[�g��]w�ږi
320 +�tx��i>��� ƅ� � {��h�ٹ���'���@�����d;�p{ܨ��Dqi�唀Es/�O����jQ��a':[,o)���$×�ڢy�����ĜIt����{^G�@�n�� ���Ռ��(@��+���]]AS�a�� ���r-�@����b�~��ǃ�����x�m� #^�n�_+�Ϛ�Q>
321 +�{'�Q���F驴��Fw-��oZ$�~�@�@,��O�;'iFFF,� 8�@����R>s��ļ�3S�` ؇�-ϣ?�3�����d��1��T�τ���T��/� =o���՚Y��[��Ԇζ.H�#� ?�Fݷ� �n��y�ק4�+ �P�D���`}��|3�L��+2*=�M���Q�
322 +�B|��!�A��:&F���Fĭ��E}�5ۇ����خڸp���[V5���eկF�04<�_ X5�BR ϘU�܂\�(��X<�����ä����&�@B�.GN���'�� ��D��C��O�(b�����(B9n�0P�F��Z^�z$��D������0���A�:�Ĵ��Dwn]��Xp��0�qѪ^K;7˓��uG]9D�aM�j
323 +��K "�z��ȃ���r����oZ�T!�1�y�-�XV��ʈ ���O@8��� ���������˶O�8�]8���3Y�\���b�.t �X�^z2K��I�̢yz�F�;Q~ȓiy�ψ%@".u��_XQ�\���`�D��K�+�_�~�;��%7����@��lb��B"T��"����3�A�㭫w
324 +�ܔ�R
325 +��{o�Wm\x�B�S�c��^�/ y�=P���l�Y9Y���BVVH1�'@�O�<7e���x�u��fgr�����Sz2�G���.��3ԎC]tA�Ʉ3`{K�~P0RHQ�_ZF��R|�;��c:2h�]���CE��Le�PNx��1���Xǻ�0ƃ[W�Z � j'.C+7^x
326 ++���hY���]�$B`ttT���Hx`n~.*gT@,f��唹`�uB�����z�������aV)攞��G��Hn���z�u���x��q�O��6�ah���PR�@aa��4���f`�H�9B�#�+*��M�$ ��2A���;f���k�ˢ��3�7?A���^)����u����2�VT,c1� 3h�� f+��K��d����H4044��T�r�SI#,�����=�h斝�'�����߫-�M�V�� ��''q�n���^���aZm����Ԋ�C��3����J��R$�B 1CH��9�w�v��C�����'�����%��Y�����eG��c�a��.*s3n��+$YX��6��Q"4@M��4�:�cph8208t.k���ؿc6-�BTRV q4SҼ�8�v �2�lu�|;fb~>��Z�,�>�9�.������ߎ"N����`�~�Eb�B��э��v=ᘑ���������^�9�mճF]��X�v�XP;Fa7 ����`ϯ�6����x IDATF��U��u"tj�������}�_�o���յ%w�`Z�����j|~�n((*�(f�x��^y�e=�O��0ӽ��F���w'+f��g��ꡙ��/dMv� 6FQ�����R����pN����f4G��c���7^��/���(����2����}��ȅ.�J|~���$U�֫��jx��h�DО��y������Y���L-=�|V�[Ax?����D��@� ��572@B�N�8Gg�s�,,PR�h�;z�;-�6��C��.9Ug���C��/Y.!�8 KnI̚�ʢ\ddfX"
327 +Ƞ���7n�� �bJ��( ���n_���kw��TgD�fv2�>�r�~^Ӹ���:k��]S�R^rS�"EѾΠ��
328 +.N��?@U9�2į�<�������%D�"'�7:^Fk_��M��L�/?eyն��y���� � b�k��\Hv@q3� ==�y����Z���5�{���1D8
329 +@�o��{]�?D�F��ee��Mf���_Y�^�F}�ݲ]Rjƥ�_ts�Q _!Ї�7�%D��@���(�.�)�� '=��|�'H�£�.�ׂd��Sz��rM�K": W1�5��}:Q��D"��`���dF�pa�~ �
330 +Q7'�S�5M��kv���;
331 +@��X�n���`� �!���?� �{�����3����(9���m�1�0Y��꽪�7�GX�K+���_�o��@B���g`N����g[:]����ܯo.VNF3��+��@;z�o�27B$��V �h�@Gk���������o�Wr��r�1�Z �7g��e�����n ]����2�C
332 +�� /�i7+���q{k2{��g���K�8��ô�����J@vN6H1o��$�Q! +ơw�q��U���,�,N�:���X���$j�Á�}��'a�A��P��;�z� ''�$��íݶ��=u��8��%���(�|ݩ^_A���9�,Х��@�Qf`�SP�[��y��E�2��k*� E�3@Y,u$���%\R���R�����qy����9�I˷�O�l(�����z �c�m*�����Hr��42�����u ����16���dݕ��� ��ф�^��������Iʲ����v�1޻9G�q�\s��Z��5bb`��ٓ�2��4���TD�>v�^��7\��T3����6��hP|��H�L�@H����2��FAV)<&���L[� -}u2��%�kCB���"̌�&�`� �V�h$����7wz �;�������|���0o����v����>G�᭹��s=�!�y����D?1Ԓ�"CS?�G��?��wHx S�pٚ���Z���Y�����W���b0[�3�Q�_���
333 +i���-}#�h��G{��(�o\��Fw����˙�����ֱ���P�̀=-��t���OOd�5�Ddff�Z8�J�}L�y���m"6�#G�ᵹ�e�.O�F@���+H�&��WM��&D��ƽƒq��e7͘�)�*�%D�����\TTW 3[(��$-��O��T茁Ƥ�e=�| اo�=�)u�X�>�g�X�ҜJs_�$�.�������b�Z�����a���h��.�}��F�o�}7����2�����"i�@� >ӔNmT6&��VM��X��������7U�T\𪣹�M��Ѕ�5�\�ӬA[���4�JW��rtE���Kx����zY�P�#c��G2���3������h����z�Դ�r����m���M�������K��A����{Cx����Jh(G��,]s�
334 +X��o�bф>���O�Sͅm���Nc�m�8��V��S׍G�L���#�����FI������R�@�i�����d�GC  �~�#���}�8�U`����8��\�gZ& %� ���a���d��1T574C�&4���N������c��QH���m힄k�0���{��4<�ES,������O |��U��J�h�O!=a��X��NP�XEҊ�/@�/ ���M���ۯ[$�@(��c0
335 +
336 +A��E!�5����c
337 +0����՘Æ�6�dU,W+��߃� I㞚�1Ђ�7����j2DKC F��U6� �D��0:��ϒ�7�z�D����Q����������7L!�������'�w�K��T���Ah�M����xPZY���R��h�#�ߓ�g�K�e"͓�ǯ[$���K|d�W���x��|�����ߎ����R~�nUIU���݈XP�C[s;z:{ �_���Æ�� �)�_Eu�c_��&���%E`
338 +�J��|��O�X�=�𷟙���8\v�lߨ7�����y 'Ɗ&��~+1���@X�r�a=n_N������
339 +�XQRU�(�,��AL�� �@re���@��_ֈd����}~{o��r�) |ս k(B�I��S(��G�Wܧ��q����h�G��}��DK=.� %e%zh`
340 +���MJ�)�*���� /�0%�s�AH�f������ӏ��F�S�Q"!������h��`~����~W� O�A�;�`
341 +h]}߂�P������%��^b��ܑ����DUjV=��X�G��'H�o�� ����\V 4kNR�]��Oӳ0Z=OWl�˵��m�װ#�
342 + (%��b0:P��ò~GL�=`~�@��r��F�9
343 +�^�U[���'�o
344 +��hD�#�;�a����V�?����l�pE���������φ#�U�j���;�����C��o��@�N��:.ΓgV_�ry&`�j4��a��,��?�����-��1++ Y�YV����&�@���e�(֔���(S@��M��ѽ �����(B�����M�7hܝ<A�<������D�RM�ӈ�f����G�f� ���w����(�.CQI�%ȁ�9өnq�|O�B=�B�9��c(2���7q�s��s�>�����AáFCi��XX-� '~�1�Y�_Ys?� ����o76c��f�Q���\q��*�[�_�B�x"�������{�[�Q�%Y�;�8�ңي�jִ��� �?�K��@��i��桺���dAF��ti猪�R.��� �p��U����2�?���M ��M��0���`�_��G�\y���?��0��|Â|��\˄ S(ףL�CL�ݺz�d~���y��==ףeG]�\�>-"������訮y�Y��U����غ��f�c�vg��Y%��!��&}#]z:`I
345 +de������������@�0ɷGh��q<���^�~�eBu`
346 +o���G�i�S���)��Q
347 +2�I�j�����+Iz��6_�+R�2Yu�i����/f�b�m\6��a ���NȁjfV##+c�]w��8�uQ��3R� P��@^i�ky��H8���.�6��Zrrr���iT�/&˜�m��7��g���v�_�޼��qPw�).�#L�� �fT���t�#7��;�n�� �/� *}���:��\
348 +�K@4@L$��(V��%)��*K+�Y���v% �U�,�Ƭ�`�Gt�:��P��vX��bࢬ�v������� �Wr�5���wT?�3�@DO���?l[�t{2I|1G�"���;�4�|����O�����~�cf:� 9������*
349 +R]J@��|���G_?�Q�dBTS[��ܬx�䔷sKOGm�|�=�� Q1�������-��!a��hdz`����ͅ%@$lO>LQ0� ��!�3`<5�6��m��7��v ��Q���s{�;�&o%��)���Q&��K�]y�e}�c�� ��Q�E��\���n��}�sr 10����>�i����3*S���|�J�(��� �r[��g���� Z[�0lY ї�L�H?�K\�l�*���C7�73���נ��7B�=��>�%a�$Ž0I����g7,���Z ���)D�x�Ɲ��{ /�n��˼ё�K�]�2�2I��%@��c���̬ T�V��� _)P��S8��<����'�]FBC��|M}u��xh��:'��RPP��Ȉ7���도� �j�����NѨ����������QbD��K��7i�O:{B��(i�]��}F�Bkb���j��\�x��� �$�Hh`oO/����fVu����m�,�
350 +s��@n��i��������UJgM�t>��� �.B�ǽ%??��>of�I}�����(Sd�����u��yq����=�Č�[����� J#
351 +�R����{�u�}7
352 +�n�P��
353 +�W��od�>1qJ&��^cÆ���J���rCt��סSpr�7N�83��B,v��� u@��N�X��{�0�C}|~�A��� m��N���s�8gb�� ���n �n���.b�3��V+���ذ�n7n��rt��"W�hfT@fv&jgπ�t��e�b^�Y(Ȳ�R��W�m��(��������_��H�w�om����Qmڥ�?�vf*�\~߲L������қ) ��k[\���ya�2.o�1zz�慫��*Kj��$Pv��.�(�7�K�P=��q��|Y���-���%�!�k?����n�x�6���\��܆�#�J������#�C[���Y����t�"�fW1�\:� ?�/=n��z�����'�%�n�Wo^��`|�\���>�* `d�<�@� ��$a�#�G@6�S��BU�,[����W��{ȴ�xg_L�ݝ�h:�oUS)eЧwlh�:�B��Y�?��� �2��������� *S3��� �VRQ��� ����{2�~=Lg�Zy���| �������n��1PhD�Ld��Z�� �L���b�+@^f!敝���I�U�:��AC�A�u@8j^ΌD���ۏ� Vb�nUT�'�75����\�e>�I��կ[��]�����57�AW�W��W�����Fyc�m�_��SO��U�t��� ��g�}��&H�C�C4�c�������5���%���# N����Sz:�3��@�kl�o�M�á!�o����0�߬ם| �O�n����-� k� 9
354 +� &)�]�+t�����j̾�?�8����݃p8�D8�_�X22�Q;�V�w���Jr*u�� �^�t�q�s?��mk��j ��|�#z�3�������Wn�F�(���^51����T�,�3�d�?����`,AU�c��b?~o%4�8�\W��,h"�����08�M�R@���� =��:�Jķ<sw�)a†�( ��> �_}��y�D ���\��H"���g�c�ܙN�@3& Im�P�U�����k+H8:1�7��pH2ʦ��/؆���l�D[��9 h��/9������
355 +o��}f?G�| ���tB�N���>�L�XZ^�X2�֩D����<T�Byn ��$��i�á��s�E��O��_Q���(�� ��k�#����R7n`��n�Q,==��ܑͿg>#r���)�X&R���hѭ�u�Ldd�/��h��Ԟ8J����2��5�/@�Tt�����#݈�B�m�O��顽��y�hb>�N��-{6�
356 +׊#v��uf)1� }J/���]\
357 +��yQ�Q(�E0Ct+@E)�f8�f���6=.���Q�[���*d����$��=h��G�H$�_� ��M�����``P44�7�=��nص��P���B��`
358 +`���U��J�kL�2�vc׭�F���\8V;� ��X�n?��ru���d��M��$��M>�A�`�~� �/I�R]���140x����qw�k���d��(�E��� U�7���|B�k{�p���~I�Wn�e�e��a"�O�IE���#ݛ���<=R '��~�ʚ�Ȧ?<6��h/��;12>��p5l�:��SB����M�70��k|�
359 +��9t�Ĭg�ֲj�2�V]��7�4�vt��M_聅Ȍ�����9�� �a�����qat�<���ϓ�to2��H�f��I�����(.�^�Y��������uӾd� E���!M9��ά��� ��2c���g75==�~��s���3,��o,��0}�'���Jp 9�d ��@��5z�`G���{]>x\^�]nH�B.=a���G�9��C_D�v'�㭊p8���N��(a���Э�����QmZ�G�� �ѿ+�ZV��D�` ��^`�ѯU �� ��4��-�0+sO������S���9H(`ow/�6�B;7?sw�c�5j����s﮻������h��_sE��ja���z��h
360 + �8�0�����=�ݫX���wn_��U()�o~yS��i|Z" ������M#�?���;6����F�ܖ�Xyv����M����]��Q��E%�o�M j$�LM��5�KQ�˥Q��7|����u�-W���������T�� �
361 +����9�͆��5/�-[#040��_y�H���jF�w�Ctd�8
362 +��_�cw^N��P�%���n�^�"��A�څ0uE�޶v�I�.��$c�}�&�g�(0zJ]nj�Ԣ�ĺ e���i�A�d �\�&�b�otȀ�d�Ӷ�_���Jb����� �Aha����o�;���Ч��D���kէ��� �E ��+@N^�:r%����������u52-0po��w������=L�' @
363 +��-K� U�)Xlx�_a�ˤ���A�Ƈ�vOB�9�~�z51�M�z;�y3�_�o1ȝ�8X�ёQ�j�X�zTeܾkc��ڴnK�`ݹ��gz���%K���H>���z9�D���/ ��Go��:���j�M�3����C�'_2�'�
364 +�_����gCQ��+tjpHq�F��(d@}ƍ��TVo۵��9��nK�`ݹ��g�?���*�04��1U��B���g�� ��w��m�k[���3`| ��l�Xu{�� '7�覝�l����4��������nMQ�����/6j٦��S[DŽ�� /���jHX)��OL�~�Țg�0"����RVe��`� d�������)Ϋ����T�������Ҏζ.��'d@ |s��-�1�Q 7�|�,<9�tm�� ���+��X��[��q�>Ÿ�o�n��ŗv�w*嗮����0{*�����)��Cf���-%
365 +��" y<: f��
366 +n�qW�/��q�Sn ,߰ �G�8�FN�� /�c.��?���ht��E7άvy"w��/2 ���%�1{�N 눃�����F����F�aC��v��g74?�̋���X��r�����P�;0�P�y������}�ƽC�����~�rA�3�3�>���=�4#�7z�N{�! �<���p�M!�4F�'�[����3cZ�v+����S�ڸ�l��� �S1�ׄx�\�m�����H`�e�TTrT�!3�
367 +�fV �*K+@�ԩ*��,���<p�ȁ�p�[~bd�Vm�Q�:3q��;�{������Qͤ�ʝ?��}䱛���s�.][�)�>J<��$����l�;m.���w# ����׍�'J��<��y���Z�-G�����/��\�*��(���I�V���IQJFl�$:p�G�������F[�����@� �Ytʦ2Bt�׌N��Ւ���۶A�-��8
368 +@�N�U�.�QT� ���"u2������\�)'�Q+�D�~�g����2T�VAq9�@��֩/5�-�`�|3¼a��֓�1�O�4�(����Fߖ�>e�n�����N��J�;�����oYY�� &���(���4I��BVVűmGYȊ 8�%AǞq\�/�HBAeM�Iwҝ�����;��yI3�t��^U�ï��~�V�s�=�;���wZ���X���\WV��.���ؚ�/-# g�� x}��&�t��@�M9� IDAT�R���5������ؖ} uT�m§�H)NX�8�᳛M�Z&��)-0��i����/�i�1k��uիX ���sΘ���E��T ��H���>�;4
369 +޵��6;)�^=) ����8�^|��O��@��g�m��<� �,���<��wt��� �
370 +0봙�06���� �`��{16Q�Hǻ�M��wnl�+-y��;���vy�\�L�۝��M�ɯ��y�����~>j��Rb�Jo�{�-0 ׍Z�(2�Y1��W�!YY��k+��D��yyv.�D�{יH�LW΀v��J
371 +$#�W�C��������M ,N�.��&�fs�!Oc=lf�`M#m���A->�/ C�*J�k�%���w�+����ilJX���a i����C���5�m��
372 +c�'-z���f"q��X�NU3�,N]�é��*R�ёQ�H|l�����O�yx��}N�Ւ�%������>�4����b0�q�̦De� <jx�go�����ư�)�0岤N����O{�Ff�.'Il"  V�4�# c`�0�'��:�W��ٕ������5��3�_k��IVNN�7��>���Ou��I ��� ���G� �m�7���c\�>���L��6�L�3�3���`�@�c&c{�ǿ���� �.�*R)T���Nw/h}���g�荸�Y�p0�:� Ÿ4���xv� ��g���K����ɸ��8uq�fO�����Q΀v��s4��p�A����6N5��ݺ�΃/���I:��_�j�+���h�ef�v�e,��1� ���� ��])!#���A�a�� ��p�44��ڌ��<����!���oIy�� ��SmW��D����8��Z���M3a�%�c��u{�/�yx9��`]zl���z�)sO����������1"+kc���ٮ���)=+�`벫����|s���~$m�s��_͌;�"���P%�u՗�������a_D���i����uff�o� ^"W���]���8_|��/����q� ZA@%8�� 4����O5�8���.T��:-��I�{�t��W��r\��`:spp����`A� G[~�ܙ(*)��R΀�b�����at���Z������x<�O�8��߁��ޠ�R�|F~�1��4��>j4|�A�gykG�����'�g ���`�6���2G��� ;��*�[D^�L���5��x�A+ �%Ue����>�%Z:����,�?>:�#g����7�4|0D?���n�/��̹3�3����۟x����^�Էd��\^�t�hHOOGvN����X 0%����/L� ��+nxui}�=͜W�f)��e�I!8�|��%}mc4\PC�h�փ�5.$����̬��\,q�"����ݻ벆��9Wm퐷�*�@hŽK�=�$\ �?�y|����0-e�N����w���� � `'�S��&[{!�X���^�N��DN���\p�]p{�ʑ3�k'>-M���e_��tdg�]8���h��?�F�``��4E�%��\�0���v*�����kY��/NVG)����9�+�=�0�Z@[L���� ����)�����0>>��L��\3��e�p�l�D��<��A����0F�G162f�І��F�^��t� ���Dfv��( �q��ߌ����+GX###ò��a�˵��@dɤ��W�
373 +�;(¡�[M�=�m�n }>�L�en���B |�ڬ >E�O�`/�4�phL����� 9����|̘]���<�H��@ߠ�8g�7�=���L�,��G����l���Bx������{}r��G�'�{�^xUc\t2�6��l�Tl��i���~���>��G���s'l���#�CA��~l=EkrS<㝧�g�8�.����~�v�`tx�Y�9n
374 +ߤ" �}�^��GaQ!�i����ٓ-�Xc�^k���P�w��5���iY�����n[��?N�ڙ�m;�Q�\����� tԙ����7}ɩ3�y1�3���΀3�Ԡ��h�|���1)'��$���������-?�YʀF��@^~�J -�����7# ��� `�>�1y� ��P}�t��ջ����s4+�=;}t$m1鸜a~��I��X\�Ig�P�c5���|��R���Sڑ��j�L��̗���D�C_�s�-ߏ�l����l�� OvIVV�e��9�bu�ٶU��T
375 +�];L�����d��X� d��f�(FX��PX��
376 + N�v����ig͵ȔD���#������0���͊��ֶ����|�V�ZN��i�����^�1�Q��0-`�Ƿ��� �ص�T?!!p�拽��Y��/�1Xa4��T���(�öf"�������pz�!C� ��C��P�ǎz��m�İQKʊQXR8����r���^��6v��b�&O2� �ŶU�.W
377 +�];L�3%�ݼ�Ȁ�)f���ς�Լ���_"�3�N),.�r�������8r�z�{��c2���P@� ������23�t� �_���'��(�D����V���R���Q��@]�<OZA�Y&��T�1��8�6u�'�����N��|�;o�C�$t$m���V+�/���)�Q�VR�Y(-/���#E���^z�e[����K�J���۶�ڽQ)�}.U�8! ̀�Q���D$i�Ζe=��ӴOج|�̜3�2O�/�H���֖6���YL}� -��x �"�I�?}*Lm�9��F����ʔecY 77�rƜ
378 +���|�#k�~J)��E������.�"�O�P>5]oX�GQX��FFF,_���J�P9�Be�b�d���O��v[j��ZaU�x=(.-�"�G`:�DjW��/�n�ts�r!�)� 0�<16��ƛ�?!Ӓ��u�M�Ζm^�n0��c`; yG��l����9g�V���r�������v[=��G=�ek�tH-
379 +�8r���V����, @� ] lٶz����-~Ӵ��� ��[���}`^��>�@~��s���PX���c#������C�zx��� ���G�ab�^��D�Sa�����A ���N4�;����E�!�Ab��0i�#�v�T�R
380 +�=�nZ�r��� 4�F��r'����5����·@���.�����p���b �Ȓ����������%�x)O�(ť���9�nmhh0O6W���.H���mX�ht3��N��7Qc<��D=�g�c�i��3�q�!�ow��'>U������ V� �?���gN���ۦ' �$
381 + =]HFSU��['L�ۍ����j�JH�=��y-߲�"6�[,�%<�$y�%!�����Y�Ͳ���⊗�_B�$E���y���m[��*�PXR���Q�ܵ4BOWO��D\^R9� a��(�<�/�������:��0B���B��?n&�ñ��V�QN�3�����7Eoz�.���
382 +�V~��P��t9I"TYSa���H&����M���f��"���C�_�<�j� 's�;~�JH�]��)]�e�AC[�g$�7�E
383 +�ߏqy�e��˽zV��"x:�8��>b���%@ ��
384 +�
385 +P^U���2[ ��Dؙ P��E����$ޟ🆩����|1Թ) T�T�S"p����V�FKT$#\� ��On��ˬ�gZ�@��&�X ���GsS���u�Id��ȏ8�� c�+�l��� L�T��L�G3̟���[��+�B)��iJ�<�o��6���*� JT]O>����z�C�jf�� F8⧛�c#c8��� �L��:$O�E����FY����D�KrrrR%%s�&0��?we����gw��g��v^��sŭ����ρ�%��}�����o{�`�������L7�{[<l+'|2�,���(��=��l�� � X��L�4��Ė6!�8�n�`��S�\�ts�{Y)�"��Y,[��X�oa~*@��h���t̘3�z��N2��`�A���M���=Wq\+�*���=����Ճ����h���!33)p��~1�a �\��)+ij��1�4�J�c�*L"p�wW���M H��'����$�@�E�[^����� ?��YT�J�F � U3��,��,� ��]� �$�3��_����e���_�r*r�p�T
386 +@8h��oB`馅���ޑJ�H4���o;EB�*K�U2���!4��4���"�WB
387 +TZQj�dV%�S�: ۣ]"���(��f��@�����i�O��}����T
388 +��w�S�wՆ%�A-p��8��7�$�L�k���p`"h ���քP?fEr�s,g�i�Snaf������ �i�P^A��O22�7,pdx���@>v������r떟 ���������_��;^) ^Ȧx��6�_h�X�4Se �p�n& c�`��$�&����� }ݽ���+ȱk~r��9g�
389 +�R>P�Z������?� &邅@,�*���^�ok����KNn�i�:������eB6����� � pmd�5���R{��sGÎ��G( Y?A ��M�W�&��L�PN�=�Dbc�l#�ȼ�/�F�&�$��e�{O>��ꅦ�w�p���p��LD&8;�1�}�3����̮�p$�����;��_z��p[�A���Ҋ�v7Q5i�L��eB� �C IZ� �x
390 +f� ��gD`5s���τ~0�A�bn"]�K�}c~�P�=�{�* �>=�M Wx 32��Ð[����`�&"�%b����C�G^)���U�sɅ�E;�'��+�+����wʨ`p �{�o$@ffeXa��C"�Ċ��Xm��.�7�~��ַ�[��:��L�\Z�ITD@�,S!�@�S�7A��$�ňi��s� �e�F�!������c�� �J��i\w����0�eN����8�.�c2��}�#zd��Y9���
391 +f��m����]3�9y��<ؾ|� ���^��( !�*-/A�ʤ{.JD >������ �I��� ܆q�������l_C�i��pw�*o!�|s�7��% �Dn�<��~ף?�~����[vѺ�ڽ̶k�BQZ3�b Hf/�S�%���=tP�MI���Y����L"�ͭ�1�!��kvmlݚLX�{�J�7�)�~�6����L~�1�rlOe{cct��/ע�+�E&���۹��eeL�/�P1󿤁��� ��*w�@,�L"I���G�m����nܹ��76�������%r��o�]Ì5l �;�����'�F �ys��9��7V���� _�s$)�|�ge'%cٔP���W�cb"$w�)ۛ�$j������I�`����/�ۄ�Ff�������gt��$X$'q��Z �� �Z���Ä�A���n�+�8�'糤~��~����k���3�8x%1g� ��P�vw��~��M�u'{���3��L��"������ޗ�ښ��L���k}�멷"��R"�nZ׼�KJ����? ��X$��h�0�aW�̢�����ڹ�U3*QZY�JiK-�������-��$Z�Z4s� �Ғ#AP��?������b��A����J�;ĩ���͵kX�����'z��j(_,�_��r�It3��Ǣ�P�8X�l��SNO��l��(����LwD�D��ٿ�� G:��|�-5Ҿ<4T����=�Z�T
392 +@�q�f�tâZ"�[ ^IFh��k�x =0QV~C�ٯB���J-��:O�c93�M�n�(/t�B�*���$C�Ch�׌���T�V��"�EQ,*-J���xxp�M-?ۄ���5;�>�s��L����$ ��a�}wI�������x4�E?�xh���k��__�&�®1H����{*��J��]4�H��d!~@y
393 +�Kx�d�y��O��g����dY)��s���g�f|��Opl s��������J�� � �V�e��۹ �%(�*O�p���^�}y���v���}I��b��ID0Nx���n+��B�FS÷w�u�E;�M���� ���1.�<�|�W���1rt��/�K8�n�J�� `������Y9BO���� ��;� �H��B�>�6����[ۭ4��
394 +�n����m�l�7 :S
395 +@,R2 ����Pӵ�:�eղra��p�o������<=#C�$���<��%��U3+QX\�Vהp�w�w����D
396 +�\PT����8��H@[������'\]�����w4t)Ǔ� ���BHԔ��=�pi70�����:����qۚ]w$j'�w� 0��v�K�W��D8`0D�.4�o�”�K�"�9�~�5�B��Pm�1&�b��-�ec�I�U�_�I3%5�D"p���s5��� ��4'�g��� �!~˚�y��gv'r'T��� ì�J;�&i_%�[z�m<Dq��ĀK���K��
397 +�0�َW��C�L�̯i����M-�K�S�-���J:k�lc�i��q0>�{ �4�.�{��Ť�z��]�u�x@1me� t%�ǣ���)ပ3*����D� S) �[HrX
398 +���vc٘<�t�u�����d��On:��X�'U�R
399 +@���������:-��I��Cz��W$�LҸ�"m� }����� ����a:9uf}=��F��&� ���K]�^J��t1� fY�tX�����
400 +8�9�������A��@b^�B��᩻���� 6�R���I�q��$�h��Y{�/o��X�h�h�RH��k�"\h���8�d� ��|b�{��1��9��`���o���Hl'?EkL����}φ�c�v�$�) IJ 3�,ZSS�鼖�o�s4B�*���<�4Ltut��uu����(�p�t�]wIe�0�Y#�O���S����d�( �+��O>�����!��x��AK8�(��"���@����M�PTR�Y����3E���>��P�d��U�|_(���5*'"��E7T��L�?>î!
401 +�KYU*�+��
402 +}=}���~HH������bTϪ���8�024b��H���D��5��;�<�ng��ԗR�i��X�@���j�徕�K����H4@��� XD@c��v—�}�_HYe)�*�;GQ����@���|d��g*��ص�T?)�@�O�y�:�gL��/^><4Tk�T�p��
403 +H�w2���0Z�Z0�gc6�dl���B(�������4���: ���d��Ȇ���[�)b!t�,!���LO��/q�����q!H�e��!�?1���՝.��v������|�  �����B�”D��8�VϪAVNf�š���m��� �;�ַ�ns�I՝R�j��`�@�s?��
404 + ��L���'h��! �����^���gƶ���Y�^����G @G[�u#T=�0��x<�7�$�O�zp`(���I2�&���w��fo�[g}gJ�C�B� p�w�) ��t�3P�����OQB�18`��
405 +��@vnv�".f`qG@;C’�S \���ˊP3�Ƒ���dt�wY
406 +�(~v �i�]68X�z�?5�J�kW�~���Ԗ����A8@ 9'�b�������]S�����D�ʎ��m�b�%;����yQVU�R��DN�OX��������c����!��{���_�lO�(�vM�����ٝ����T�\l�/��_\��BMn4��ݐg�Db�K*JPUS����.��܊�e��f���լ*d�8�"d�����S�a6;;g��қ���4zh<|�q����p})
407 +�T��D��-��:�H3�#��@E����p``��n�H�ת��I(���x`�A;�K���'���3��p�2x���i)v*ɲ������Cf�z�a>j��_GapL� IDAT�r������اA))���&s*�z`�/�8:]J�盌"r�����z{�%7��ʰ�DHV����&��M$�4:n�׃��2� ʉr���f9|�i������|��a���#^b�:�]�}��U�M�ͧ'~zԘb�������a&\L�� D}��ͦ����z��yU9�ğ^��v8�VGP�9��?�?�� 0���L^^��7���a���+`��Ix"��s���D�
408 +�_+��B�|5��#p�]K
409 +���Ո>�"5��$fJ~ ����
410 +,)D��*�-0YEI4��ךT4@��8��_5����Q���0g]qQ���� �L`�� �?���)���Ul�nI���~S����͋�u0���;�TS�0���a���OU4��n��$;`�
411 +  ~v;��t1�Xzf:*�+P�P�?���҆�#�������/�r�"M`��Չwi=�Wl�a �NJ{�vi�0�l/�� 2�3�����~���Q
412 +LUL!�p���O��`s>��ɯ�X�6�~?�:�l�Ŋ�����J�� �8q��$4��?Q�j�����{�˻^�I��S,��#��e‹:����M�]�D̞���y���7Ng��Z91��8��������"����f|�HCCC\�(+`�m��=����5Z�� �O8@\c������VS��k(.-�ހ].WR���)�Fд���[���������b�t���Ǒ+�������H���!`� �|��0Z�� B3�F�hE��=T ���{�i��4y�9�l0j<��f�-_��~�%J� ������zj��݇@�iB���#T��@������um�1���S�^�$ph�^�Sa��Ue}�%��@B%[����Ɉ����J -�dt��s����i�zZ�����|�fE ����t0���H�O����`���B ��4� lB���\
413 +~�b�D���D��@�=ӽ����y@)N��1���� ��_|*�����|ɍ��Y��v��o�!c����L��R0#3�b�,(�:�%n3�����v[t���,�M1���3�&At����Q@�R�� ��;������� �R�ZU� ,�4���*ޏ�����$���@0h_v@ݥ[��3� O�,V4E��o��4&Yps�]��Gie�c��5G����!dOvJNn������ήm�K�L��L��ٮ��l�J�m�TG�@`٦��������>�jS�$�nn���\�̮NjV�Il����C�H;��:��e��*+'$�ꄌY�9$�o�/f>s!�c��G�d���R�,$ΊO�q�Dy��/i�J�R
414 +�WX )4��R{�ɸ��e a��� �}�}� <F���TL�N  g�VH��0�=��a�$�x쬨��2�9��#���ڎ#�ڭ�;�f�S;Y_� �o=�o?|ݮף�R�AO�M�7,x���6��[��&bP����ik8�Y�rFeJ�>����^�8d�y"�L(}
415 +����-)/q���C�_����e/5��������̔� ��'��9@�Ӽߏ�)P)a ��:��7,xm"�|'����?I8�� �S�
416 +�0cN 䖘
417 +"�B"s���8��2m壬� B��d�̎�-��7ឮk(,,�8�����-`��WM��?���
418 +�'���ކ��Λ���m�@��o���fp����g�X� �Rc�0011����-k�t9̲�QY]�x�GI�}��Ѽv�Ő�!�0��/���d�f�1ѿo_���H'��H�S�lG� ����4೉|�?�����g;��7J�K,_�T�M��l;����$J�GI��_���w�ɡ���[�C�raH����? � ?J���3�R��W�8t���T��z"��S��'�ttt��~-����g̝ ��ВrgY��A� hdxz������2������d�_Ɏi�H�kQQ��*�o����u���^��=ܺR^)����؉խ���!\O��c����V@�uo��mQ�$T,��³o�M-�&���QVY��ₓ��u���v(i���t��g����}@�4� ���|$C)����؆@}���܉:��C2l�8Ž$Zg����UVQj%J59� ����r0��y�N,����_T��p�����E��a;���%�FFƴ��[
419 +a1nyx��?D�_� j��-��C;P�p�i�C�gK�Qv"T��v�c�]"�g�E��5w�#������!����h�� 1e ��(q�!,�� ��/!��H�,f�¢B�?��}ϙ��GV�~4��� j�N�`�e��+�I�@+��a�z����5./3+5�j,��T��ѱ7���~o���Ɵ���Ҋ��/Y�l��Gh;���y�\��@�ڞ��a�mkw����K) �T��#p�K|Ɛ�Rf�P2x����'p���ȫ�}}�'�@�@�$@�R�!J�Z�����ܒ�O�1�l<��(������T\R�؜v}��󿺁����R$�* �T��"P��:��qx�nj���΢k\rsO�dc�f�Wi�mz��Ϯ��?1�\�"Xc<�&��Y�ς,�.=�=�"016��Dl���=qZ�t��������%��U��#���p�[��O����Z7|��Mח�vG$�( �T�x"@u��L�;L��xvE�BQ'�8�x���o]�ԁ�6�����Ӆm��ii��Y�:�@S,��.v�v����:��,�d!��7kQ�$����'��Fr5�w0!��K��}>_Rb���C�l]���#mW)�"������yw^��4��P�N"oTn����D��L��Y}��54�8.���]W�Ib�ö���RϪ�V_���8ҁ��aHJZ�)rhɭ_�5���r�ӓ���yr9"���c����y����}�F���78��������H�R
420 +@�ȩzqA`���8� �����&�N0�h�=�= o������v=�x2�31��92��&B��މ���F������H&�’��=�'���2�{0!��������� �ɩIE�ᔷ�O�h74~mgW��) R�T��#0y�׉�����wY�bW�k �3����!��)��u��1�
421 +;s�|^T�T���)�M S� 5mwg7���pLy���YPn��#��Yٙ(()��R�Z0lmn=��o3�߱M��k.�:m�1X
422 +�*&� B:xZ) � �|��5{��) �Tݘ"pտ�Sjx<�L�RL��11�Ahf�0�=���{�ij���C��©MY+�\qf�6sZ=�3!���G_w�FGa���Z�<��7�k����Y5%������ʸ���a�F��n}���-����.���/���,m>tp�3܊��}������G�JH�NV]�����˘o����?�����d����ٽ+�5;o���|�U ���Ĺl�鳑�m��A$��ZG8�-ǵ��a��N���)����ʴn�:!++ Y����Ͷ�`RQ��Z�F�H��t�s����
423 +�&oO �?��p�����"@�(�8��k���B( ZU�� �lâ2hƿV��DKos끻��O%٘����`�R�=�[���e(�*K4���_�āMn�b%�h�������a��?p���,�} ��z=��|Vڌ�t�}?�n�'[0yR9t�0�����:�����>.�{�?h]�iT��N��xs���4�G��j�EJ�����X�a��03�Ƣj�i��{}[�~b ��,^[}%�7ȉ��P��{��I�=kNJ�=�:��Y�y�9�X�i��)֒}���3��s�G�Z�!ֹ)����7kA�梥��Y0f%�"@@���=�������j ��V�l��X"��޳�G�}�g��o26�i�?|l�c1�q����Z���!�q�>oii>̘;#�2�rߩ�BC���v+�o"H���� �]����)GϠ�o.�[
424 +�� �����s�E�6qg�f��l��0v7��#&�����Gn�R�#R��m<�D�{-�oJ����w���?���r����-��
425 +�?H�k~� PR^b� V�� ���j�wB�0��W���D�?���l��`�Ci���� ���E�ejl���x�d���������8�H���QM)�"��G������u^��'�n,��gƝ�Z�Ϸ����0_W��� /��_Kޥ�x���N��ka�U5�@ˁt�uZ� � �P��� �v>�좽�{��Ո �p��Bְ�L�ۢuގ%���
426 +'��k���Ѽ�C���x���+ �Zu�f�oZ�~
427 +ЙvcC��`ܥ縷?��Qɜh��.?�p������3�X�J�/'��x�Z_B�,)��F����{���B)NQ�-��.�(��^��x�6D�����x�K{2a1?���k�t>�sp8�����E㊙��d�( �]�������?W�5 ��ׇ�d��b�c��-q��%�p�C�?b�!!-�I,g���=s��ɮD!*%��Z�E�� j��wj��񽮐��B�ۉ����k�3��t y3��=~����|�\&�&h5�0��
428 +�=�B���� 4��LD f������]=��X0 ��:1�аC��~�?h�����H|X�e�;5S����F�'u­���k��1����_Wu3o��� ZY�f̮A~Q��ݪ��a�;��n�%$B$�uOm8��D�/}�����^��W^����F����i��n����t���n�]c0�]�F�i�4�Q�u?�~�����=�C���Y��� 7����*W�ܼ`����G��ћo&��LK{�(ٴB��� ���l��Cn����V~�bBAD�q*�'|��?%9R&��8����v_��MQ���a�rO���:-��I�e�=4���}#F�1�b8�lhhpt�J��ew�F�A`�� �M����#NkNR��G4�>�n�K�֍�<������k�t����|�5w&r�m�"�"U-���_��M���O��_ �eຝ�=�h<R����
429 +'�����O󹴋�qZ˰��x��{��_�*�?���\W����Ơ�P�Ǫ��(,)��(Q�
430 +��omiM��_�m�񿦗��u{K�Z��"����ZfЕ������cNU".B@Ll�����7A�]_�1nx�A�:�#�'���a������H�0SU�C`x`�_o��MH����L��$\����|���������E���
431 +�W�y`�b­szv?�X u��9^���_�̹1h2�&�
432 +PR^��ٶB�*�X ������ٛH��(���3W��֘��&Yg��g�ϴ�dx�k$1��9@����x͎��?����5㣁`�#=]=3�~�m��ֽ���8m�\�g���5Tm�����Dy��R+��y����a��� ��-����[�G~^I��� ��0k��W�|9.ퟠѥ���?�� �F̹������7-��W��rf�]�W�$���?�x�o�L��;6�O�Rb�JH�eL�I,�_�(0�l�_b<�gL���o\�g,�m�����y_^�'L�'�w�P�.%���������b�4����4H� %
433 +I�<I���w ���ؤ�;76�Y��}(�>�UO! `��y�b_���LU�`�'�4hz��?�]��,f�[��dM��| ���[����(�p�^��U(���J�;�M-h?�n�5�x� �Am)�ȸ3������0���*b/b �� �� D�f�4�]?��_������C�5����Kyy7B��Ϙ<  &�
434 +��!V����y� �j���m_���kNT�_ �Jy}ޮ�����M�}�����Д��˚������ �v!1>� xB�c࿂� ���x9�fks�9����_Di���)����>� �nӫ�?��*[sM��w���624���$.�ﱹ�\.������Ӟc�붯���M0�nNv;Q�(�����s�}���٥}��� ����6c ����<E&�vy�/�Dw<�i��a�k���w��-#Ƨ�mgppC�C�,[����t�=s���xgt61>I��ݑ�H;QD�3ґ�� M�$*�A 7�d��6g ���P��_�T�!]��b��� }`V���i�ylr��f�I4�Z���R���;��6�z`���8���DL�+㎄\�/�d^�[��ZVQ��9��n�ٟP��:���v�6+��M�2�{���/i�A`0�0�{�.��v��&rMٷR���;"��O��6=?�o��YC���8f'�O�w�dz��'�"@�%9H��S�����@���!�)P�Y�Y*QP����� �DG[��%:������̬L�����1k�����. �/.C�K+.�P�*��+p�e&����jj�����_��/�#`����X%���(�]��ُ<$R�������ܜ�� @{52���%7'r��޷RR}���b�@�O�twgk�nҕ���1_��ڗ����~���&$��vYI�$e�q7���*; �1����Ⴧ-�D����s�-%�$ �_`��[��y2��M����ʫ��3�����;�4����dǪq�% Īɰ����¬�g×�UJ@X�9��(��h9x�ã ����쟕�%�'��L� v2w& ���W�%��`t4�� �z]�� M�FGGm ��K�̣�@��R���U{qE@ �;t����W(�O�����vO�
435 +�� =b��#�v5�҇*J/Uz�! ����,]��1xy��?22b%�
436 +������g#3�MNY�j7����<+�����3��~�So����S��ߎ�X4��ޱ}�[�O@l7�Rb��j-��<�I��ĸ*�Sb�����Z�!�fV�Ѱ,%I���c��8r� �G�1��M�'���A�-�W�h�B����F�H�! ���?� 2���Ž����` �Vݥc��Br(I>��G?��oo�p�&�P��?��I�'`�˥���V;C~b���8��M^���N3 +�_B�& ��:)#D��1+���KNVv&jfר����t|��_B��[�q�p{|:��U��?;��D���0��N│����~�('��Jpڊ��$]���35��d��vH� Q�2ׂ�TΨ����@;W?��&a�s��Dff��#��A�������n�>E�J+ :�T�C಻�jn�e�@��ӓ���@��?׊�
437 +�V����[�n�ToG�?�G{kZ[�O�bq���[�ᛈ� ����a����Kâ� %�!�${ճ����YA}���]����01���5�σ�Y5�+ȵh[�89�;�tZD?N���|��/O�&�-i|�' �������90|��>f�F
438 +"P�~~�O�.`�����)Z�-Ǭ��D����]}��]S_�Z���+"��o�t��_��_l�d~���`�vff�����æ���ފ�T����iX���a�"I�x��((Ѽ��PQSn�mU����#`�!�"1�K�'��� �_Ff�]�R#��5ڦ��oc�5����$���R�AO�M .����Z�1�,'LJn����NH���1()/AYe��
439 +v����02<j��uwv;dTG�!��V�I�L1� �F�1��j�z���Y���C)�����؍@�O�y��9�fS��g������ۿ(b H�C������(������748�#�����?��yK�������$�L��f�ID?0������-�g����:j��>�8|������-�� �:�?ߞ"k}xxxbp`���`b�Q�����֣;2X�e-+B�wm��d>�" IDAT`h`�Y����,>�/�c#���s@{(�^r�zg�?��޼4JH�VU#H���H�U�*�f$h'�6��#�`๞�� ����[��1�>c6
440 +��Ud�� !֟` ���^t�vX�Na���_���+2��`�إ��&&�ݚg���I���|�tW��O��]�� �[@�~ ��i��Lx�������r_c` ��Ȁ�������$�%���E�;:���Ntw�X^�Ny��7!�qt�(�&�:^ ��5��%w������iڄ9��9����Cn3��J*;����>Mj<� ��;j��Ӱ��*��ө;1��׺�{������s�����LZ�A�����������7|v���m�A���a�_oAO8mB03#S�����v���2�_�@�$`�n0�3�%?c���/o��e�i_Q���(TՓZ�~�Eе[,t� 0����݁�=x͟�D�~��� ��p�W��<%��Vt@ 8�����}=}V:_Q*���z6�� ����uʾ�1Vc�7A�~�/�I%��Rb�[Ts�G��?��������0b� �y����t��,ZS�Ҵo8�c�����د�4���e%��CE���n�QY��ķ��� �#4�~v��J��8�ӥ�?�nZ��+� e���!�V�q��<�©f����<-��p=3r�Px-�S���%�! ~B���݋�߹�v:hjt�λ�-���sl
441 +�6�% e��f"ܲm����0I���*�9���ś/��c�&������+Ʃ �~m2����;�
442 +iɢ55�H �O�iH5������
443 +���8� <���]In���'�~���u?4Z�ԝ-��{V�4�Ƽ_�F��Vٍ�m��v �m�޹Ŷ~�ԑR��j֙\�q�b F=4\ 7��r�K3�]ӽ����D�__���U'����Eo��h�/J�JPXR��"����X�� C����̸L�>�_;���}wI�/�_͠��U:Q㳡_ql1��<�z��6��.�����oE���^ۗ�čDX#�׉D�wl|����Z�}O<����W�,�%r��M�.� �PZQ���t� ͑�.���n�t�X9��"H�� ����N�t�.�x^���k�����!�+�b�M��f��}�`x��SZ)�Y 5�8#pن�u�� �B�-�sw'm��7��o�ݿ�#ԛ��cP���\��:1Q�8Y�V��t�"�0_��(���v�Y�>c�c0L��&k�$=���c[� O� �t�=�e.�5l�5D�_�8|N ��������I)JH�eS���e��� `̉�~,�0�����]O���?6�%�p�瑎���#�[,ې'ݥ[�p�%��͞����/�}]�������o�ԫ�jǃ� K�g����JH7�� ��)���rP[�p����[W>{�A�
444 +y(J*U0�X��bo?����%f.����:i�k��%�x����A��3�S�*�_�y�y(,.DzF��O 8��Ob���?y���%��IuA2�g�a��ID x=�" �ϒ��`�T1�
445 +L ��ٽ!ن.�U
446 +@2��s�\��w�p� �� ��HòY��v���뢵�����D$�F�acC������_�g)���?@n��=B t&��)��f]�(���9y�� �0AK�am�Fص}�����Q�yJ�9��A'"�|ӂKa%�I��<�������羫��m&�zh�G+gà��q"��cE��ҏZRX����~��X,~�@b�O&aHT
447 +_d<���ms%���3�?�&�x^2�0�X�����w�ڝG�,�Jp؂������70i♜���s��偕;�C����W���Lo/��W��X���.TpY�@n~.r�-�AG'��$y��������Ąҗl�e&�'ͻ�ƃO��$��
448 +������1� ���oG;/�>��p�֕���I�66��V]%���ZR����At��|��xD �>k���p���Ak���4��%`�� �n��Z���eee +'�Y����H
449 +e`2M�����8~1�'�s�[�^|6
450 +
451 +
452 +��yn��w߃kw��jO@�|� �f���t?��m[��ob��]�(�.�U? C`��څ ������O�R֣��z줡S�����,=��a�� ��j׎v��e@~|>2s2-jጌtG�
453 +�����8��F0:<j���~?��`R���j-��_�o��ϠWo_��ñ\�����<.��|���sȍ�0�/m[���1mՆƔ`Ȫ��"�|ӢK�8ɽ�֑�ӂ�'^��-���E��t����u�1�� e�uT!B!qL?��f�זu���<C��ց/
454 +���$`� eY�?���wn#Ӹp��g^ �~8e�~:��m˛ ��*^���Y7�o�vϯ��� e��$9a�j ��e�|L��m'L��?h�޸nO��Sю�n��|� .��=�߯'S����.����˅��t�-k���ֿW��6��^/|��7>>n��O����<F0�?`������vy�y���8� �� ���c�
455 ++���O����&� �����h� >��]�Ⱥ��:`8a A)a��
456 +'#K7�ެ�e�����3����E�(����߫�t�a��XNiIC6����b%�~�c�'������������r˕�d�i�<��>��A�c?�ėj��8��E^^���V!���f����cG�kn��X�3�&�4Y�(�rtT�ۆ��F�|�k��8`,a A)a��
457 +'#�7/�&�f�3K�fblli����‹:$ؗn^R �$6׀�#���L'�C^� 4�M��g�;M�$a�ĸ�&�d�|��? ������4dee{�?���� �����~-��������BM_B&����5�x"������a�����j* :�T�$@`٦�/� ���6\—ҽ���w� ���|+�=;}|��a��.5��-V�ԇ��bާj09eH~��xNiu��ee�o�����^U��g�5�.�K>7 ����έk��v��G�J���MG!p��E�Ј������@u�����h���o����[`�[�DޭEPJ���eB#� j���R�%�����x>� q<���l�o�\_�it������?�u��OȂF٩R�PUw>���=Kױ��l�<1?<����XR��j�W�sn�W0A2f���(���֓��釀E��� ##ú���D��_a�'�,J�A�|2�".Jt
458 +��5������b�g=�5 ��RB�JLV�<>:���d�y�l��O��9X��
459 +jk�t;� N57QDK�t{��;�y9���?+; ^�7ܬ��̸*#m�W1���z�ִq��Ѓ癦������!k0!tv&@�M}��kw�v���,�F|X�i�r�Č��ؓ�_�h���+w /xܽʮ��ҀXA��C!U��aKH��8�g�7-7���4��/�dB���\�����Ǡ�>�e�,���ѹ ��L��n/3�_߾&�b����R�]zU>)���5���K�q��_�6������E�;��,�����Fbݕ�r�?9��ӣeS��l�����hlx9�΀S����W�K;�s��^�w�P"�SՍ��%���aҖ�}�Gv�0�g�c���D����,ݸ`���).V�gL��>r���v d���/p3(|���1�9@�픤r�����˭?I��q{@ǖ��������0�5::O��]0-��w��g;?N9?F�������-6�{�k��aվc��&]��</�S����{�&:Pɵ�|S� �����s �� �2��b�#���Y��o��pG�w�2QZ��]�V� p�� ���;X�{���J��� ����/!��� z�a�fN�?$c���f `��(����{�g�5�0����� Ln[����R����3#����խD��ʬw!�����/�}����?���@a�7�f����F�t��2�Q��,?�r� (dB>�r�%�� ��ݱg6��*@/̝.�����]� ˙����uQ��#K7.8�@�?���Qt��E�������a�]u٦� M��>v�T�@q%@����@5�m�q�?���^_�Ik��v%�۷RXtn��z��z�i�9DZ� � p��g�t�� K0� w0�9�����?�G��O�jڹ,��3A�&�1"���h�����xd�]�aԍ��Ǿyvzv��*�����{gLD8��`dt�J���1�5n��-_n�����y��Hq"̷�Ծ�m�N�rQ��( �P ?r�n>�Rc�`��{�h�T<�:~��j�=��/F>��j^�e�k7[�1� �(Ɋ��1�7��h��vii��������w�|s���D*8�M5�T�w������������Ϲ7!����O���ժX� ��j�EmT2P�
460 +V i� ��"H��k jl��PSH8<�Z�-8e����}�$�xL��{����kؿs�g�}�^��_a��o%��X������`s(�#E�w���`U(���*u^nA�B��G ��S%�Ue\�Lw����2�݀@��n@\;Q��J�0 �V�=�u���2�:y<����(nPp�^����S�<�y�)�z�튀jM�8�G�$�U��B��RXbo��ڒ�;��Q �{DD��A3Ƀs��ᯂ �݀D]yV���M����4���9% �\�Y�]�n�<~Q]s[��h����!����M�U��C.3Zj�Ӫ�� *@%�۷_(T ���t�ڡ�U���τ����,��OJ���`�gf��
461 +P�Y< l�Ĝ]F������=�$u�$B�� �F����3=�; tzk�]�=�
462 +�?�fמ�{"��@�`FwO��������~���>�/џB��^�p�z`��%�=)�㨩�����`&<"�����r.> �QV��i��Ic�^��`��dOK@3���֝_|�Zp�� ��H� =T����������_$��6���וmk�TcA��1�>}7A ���4�-_�i�|�fc ���iQM�K#+��/Y�p��vU3�!6�:�u���)��Ѕ0�*b՘��;gB���S�.} �/�Sb�[����!��}��Bb.N�+��ĸ��cK�6�j�zr� � �@;� ��@^E�D\j7?�v�`!n�s��ol��B ���{$��,p���;�ؖ��J��Tm�] �D/��k:GR�_S��M�JKK��^/�� +:5vwj`40�J{�z��jMz�:h'J�yl���1R2wh6]=�A`WIX��,ܸ���f�ꔳ$Wt�� ��v�U=#���3��⧂�xnc��;9R7rQ�wd���p3�ֽ W�k��~#��E��#:��6� �B@����Om�O�E�ٯ���R�Z��֧��}�0I^E��GD�S���\^X��UT�>U�?5-5,ȸ��ɯ�%r~�~�C�|�C�� �%nV�tp�����%����K�6�s�8������SrZN�@^Ր�3��Ye�Ң)5%�[����8��y��dK�;TeAUG �兏�`��C_�T��첽i�쒽��@�OK <���D��ȹy�Y��� �:�x��_v@��/� ���E2vto��_���5�+8�W �,f����r-�şF�/]�W��C�����U}UH( "j�5�т���>��)��7~���C��A�9F ���)�ƔA�S��O���p0�G3=v3PcZx�z��,]��)�D;��'𝑆� hm'�_�9Z��%�������IuQ��m��if��� X�ĸ�%YiY8h�� ��p���겇�����o�����VD��HN]5q�?��{����D<�A���8�/� �Q)}�€�ͽe��"��S˻K@���Sk��B �"}
463 +�f�>q1ВR�"X�'��FVd c`�Z�D0�_�Cᦟ�-vx0� ����� $�����~���]G>��W�ml�Qk��.�6���\!��'�<��\�
464 +�s ,
465 +F�k�|��`YY�lm=�����7��M�1�++�L9��R��jKݳA����D��:����_�5B�8/*��&� @�*��#�Cvp��9 �ց�H��|��~�ٛ_�د�ܮ'��n��))�7}�Ge��2��M���)7��s��3$J�ib��|���>s�0�Ё��g��wˆ!�1�Z�����f� h "����a� �\ �$c��]�o8)�_�9�9`�s�g�!���_H��TB��˒{�9 @70���k���g���D�*��5M����;�0�懽ig�����A�rH,�.n�(f�j��*#����8-f}�Q�)1�4%�,+��@���j�@[I�y�@��,o!�L��Cކ%�]Q�~��y���n��5 d.�?]=y��Y��ƞҩ���I w3Ytc�>K��$���I{����_WVgo+䕧��@ �fG^�7�qn����ER8��d�8 h��u W�4��+���7 �@��@��+O�>�����\%^�'��҉ Gk�nZ�+}��V6�����I'շp���sNm�φj��^���M�We���|v,~D#K�8o'}�̶UlM�*��������=�}����šI�ozdS�9���-� $9��ʬK��Y]ꡫ�$����w�6U �+< ����:�O�"��G ׿�TG^e���P���-vx�-�/�Z G[gii���w0l�f�INyx "`�$�蕅u�Ze�_�I:8&/�^t{"0�*�J)y&@�^�M੆�?�|Rݞhm���:>"�t&�&5 z��~��p�;N ��:������#��kJ6���;��{3{R��'�z��c��M�-N�M�ya��7����}<� Tf^�3t�W XҘ��|�ɇr���~�'�<�+��"G�/��,(?sJ����u 75׉-�?��K�k Z���+�M1(�rhk�����[�:n�$�]��,n\�����OKkq'�[��SA4� �n���D�ڒ���9�j�Y�����4� ƣ˘��Wk��A;���Ǣ'zYzW���5��l��O��`�����=��W�����U�^������� ��uFz�&�P��� ��p�W�xD����N���/̺���W��~���Z���l۾ 9��k[����U�d!p[�A'����KS>F�0���tC�xv4kEQ��h�|�t�����<!`�0�>��0��)A�z���z( yUY��YD�#O5U���Ls�������0[�Ru�[ P�}��ٺ6v^l�A���:."�K&Y���M `/3=���^�5��#:��6� 8%��0�J�&�+S��:IQ��)�$f�b�ފ�Ԛ_7~蔳��y,�H�dG���.�"��A��(�ˁ|�"���b�q/��2RF�����G��M
466 +� ����~�ukuG!�}khIN �"�R"�r��s�˄�zt�+_Dk��8�����:�OO��,Y>�n�sM�噃��N�Ǫ+jyƗ�fx��G��؜� �h��_^6 A?~tB��^��6t7@}hIO��Rg���7j�}$�-sP �"s�`9D�=����h�g�G���I��m�] �=H*3{�O��#��TR����`�?��Vl~B��†uI�[�tI�t�˪Ց�,�:W����ޭ��X���x�g��T�Zd�$PN�����K���X���
467 +�l�NL����'ǒ@tW��_h���c�9���O��G���w��XQ\y���)jx6.��o���)4�$'���>�� ��x0‘�Nջ,g��!�uƘ����t�f���� �� ����0�g����h�z��P� +IDAT
468 +)?F-�N��E�a�Nv�[|DJ�#k���ǀ�z$�{BHry�����L��U*F�Q@n�����s��e�+�4rEq�{n�TMu,#<�����E�w�+/�Pq��5���I7֦t�wng�v��%��o�4�b y�������:��o'�}�hIN�)���) �pg/�%���J�� =-bZ��� _�m�?��r�z7��UC��ʸD |��ui�+������/?���a�|Q;�"W�.������P��&C�=u�ɱ�G����m����I��x���B�����<��ك���H�F�z��Ca����V�� �7Ue��tO�����ס��5J������5�k�ѫhYB�?N������2~�tG�g_9��fU8JY=�!8��4/ �X�>��5��X+�� 9]cAE�x��Y��S��1㏦�)�6n�V���v�|0e��Pg�:c�q�k��8i=��A��ٶw;zg]h��g��-��<�zR��i�( � J`z�&��K2{RH�����k*f
469 +/[Y�Q��v4�*�~FlW�;ǑgB�I`Ā]�ue.U�˫�>�d����\rQ���� T����r��r���3�A9�T�3�.z�m�"^#ƍ���ڡ���C]N���L��"�*n:�~q��I���<:pr�wcy��[>t(�5����=$P�GjK��rè�!�g�a ������!"jPu����\Y\K T ˙;��?-�r���4,����~�9�V6ܥ�����t�-omMpL����O�ƩL�~�OM �:it����3�0�˓�>�k֌����T:oZ0�4ðJ�P���+�r�$A�j��_wWuS9�N��Ȳ�p�@� 0ܶӤ���� ��)n^��������]S��L@�O�~ ��`�����$�\6q��X��ٯ,�<�`���t�|��q�d̫�9)��U�;.���o��@O�zo��I��TI��T9'|@�tqs�x欘���������@�8�Y�@RP[ҝz�̰�%��!�b��&��ȫ����V[[kźX�-���'�H�=`t�U_4�$1�4�o��1>���O�GMm�}����*S��" q�� ��'.6��#�Sw��d����+ h��g��� &^�� ��n�lċCGի��ze��:,u~;�e8 ��@�Œi@�)��'��N,���^P�y�d�C�y�^ �� 1me�wܲ���ct��~�d���%E3"� ����FU�(�C@���!@C�Ñ�}�X#1�6pʮ�jox'W�����94�vH ��!����I\A���l��X������=+}����극�P���B��!
470 +�ܘ���֛�?������6�%�� ��UpK\TQ�
471 +�_=y�'-t^�~�Eb($����.E��S��!�^��/�:'u&ܸA��&:�w�&Ў ؉�>dAP6$�q��?J��>!�6��F�Ӟ���EՂ��1�2���&L��\9϶�z�I/�o1�!}dP���K���R<O�*����ݨ�b��#}~y�d9�T���� D� FZ�k�ji�N���e�5?��-��Q��L���vH����. �Y`��4�0��%3D�)����u�P=���~k�.�6O���o��1� ;��-�:n�>� ;!P%�%t�= ���$����]R#����l&y@=�ѕ )�rK�w3c���{�46/+\����F �����\D�M���ۉ��E}���M!���8,��6��p��l[��g\�N��˵T�cr����á�D4/ ��ɠ9+��h���s4�� �@���&7#��k�����f�eś���>:�Q��u}�\tio LA��w�8ft�2����+�~���� �}h�@ ��?�8ӗz ��GSG��k�vZ�7�KK�
472 +�"Q-� x����b�'=d�Muz��\H� M Y T��Y����9�k$iBuq��xqQ͂�H������ӊ�u�q����� ��Ͷc:h�O�� ������K�4g���m�g-X�Vo�Oc�J�S#=C?&A �qZ<m��[��}Ɣ����yl[��t�.�^�&���*�.%���/|e`�%���'m���q�C���R&H�h�����m�#`Y�����*{���T�@\�&�� �Zx��a���*ȵ �j�Kt{0lU���5ê:c��P!�&y��6��]YT_Ӛ���@Kt�� M@�;U���+�bU�6� uh�%孫�7���(0�/g��ߊ��d"�k�#�0���L/v9���:h?�J{� �k���ØD�1 ��i1A0*YD*Wn�'GU�Nl�y#��pz�N�
473 +{o�����1�ר�u:�8�R�DHj�.@/��� �A�p�Te<����_Md��������{A�WK7u����9�v|�j���&���a�B��&������=��%��c�b� ����L��Ū���w;��M���̫�p7��ގ�����zb�����&����ӂ��&��@^��S�q�4�� ���F��|���y0,z6�H�.�K �${��*D<����[���2���t��M@��_�&3НV%e�Iu�c��/���WUã��K2{��� ��N`F�`��ZmYx���~k��z�&�"�C�B g��k�]%�Oln!�/!�?�� ?��W��F�ӹ ʯH����p&��}K�� �H� ���Bm�;*�Cp��\���h�����Y�t� �B0kԃ�(�%@���ɲ��辱�pMЉ}�en�MF�`g� ��� 2�ݼ# ���J0T��6^b���~�5�����:6���ظ�z��@R���[�a��xx�r�����r߅�`|OJ��)��Ԕ�����%p0�2P�0ĩ 2� ��){?k�kK�M;�5�A���@ii�x��_{�/�ϐ�O}�a���vm�RVfzh�@��dd6%���IEND�B`�PK
474 +���N�Q�:NNapple-touch-icon.pngPK
475 +���N������PNfavicon-32x32.pngPK
476 +���N� �ddNWfavicon-16x16.pngPK
477 +���N�}.<.< �Zfavicon.icoPK
478 +���N�!��8�site.webmanifestPK
479 +���Nͱ�w�V�Vm�android-chrome-192x192.pngPK
480 +���N���� � \�android-chrome-512x512.pngPK�X�
mvd.png
mvd.png
query/index.jsView
@@ -1,68 +1,0 @@
1-var pull = require('pull-stream')
2-var path = require('path')
3-var FlumeQuery = require('flumeview-query')
4-var explain = require('explain-error')
5-
6-function isString(s) {
7- return 'string' === typeof s
8-}
9-
10-exports.name = 'query'
11-exports.version = '1.0.0'
12-exports.manifest = {
13- read: 'source',
14- explain: 'sync'
15-}
16-
17-//what are links used for?
18-//query follows
19-//query replies
20-//query mentions (backlinks & mentions)
21-//query votes
22-
23-
24-var INDEX_VERSION = 8
25-var indexes = [
26- {key: 'log', value: ['timestamp']},
27- {key: 'clk', value: [['value', 'author'], ['value', 'sequence']] },
28- {key: 'typ', value: [['value', 'content', 'type'], ['timestamp']] },
29- {key: 'tya', value: [['value', 'content', 'type'], ['value', 'timestamp']] },
30- {key: 'cha', value: [['value', 'content', 'channel'], ['timestamp']] },
31- {key: 'aty', value: [['value', 'author'], ['value', 'content', 'type'], ['timestamp']]},
32- {key: 'ata', value: [['value', 'author'], ['value', 'content', 'type'], ['value', 'timestamp']]},
33- {key: 'art', value: [['value', 'content', 'root'], ['value', 'timestamp']]},
34- {key: 'lor', value: [['value', 'timestamp' ]]}
35-]
36-
37-//createHistoryStream( id, seq )
38-//[{$filter: {author: <id>, sequence: {$gt: <seq>}}}, {$map: true}]
39-
40-//messagesByType (type)
41-
42-//[{$filter: {content: {type: <type>}}}, {$map: true}]
43-
44-exports.init = function (ssb, config) {
45- var s = ssb._flumeUse('query', FlumeQuery(INDEX_VERSION, {indexes: indexes}))
46- var read = s.read
47- var explain = s.explain
48- s.explain = function (opts) {
49- if(!opts) opts = {}
50- if(isString(opts))
51- opts = {query: JSON.parse(opts)}
52- else if(isString(opts.query))
53- opts.query = JSON.parse(opts.query)
54- return explain(opts)
55- }
56-
57- s.read = function (opts) {
58- if(!opts) opts = {}
59- if(isString(opts))
60- opts = {query: JSON.parse(opts)}
61- else if(isString(opts.query))
62- opts.query = JSON.parse(opts.query)
63- return read(opts)
64- }
65- return s
66-}
67-
68-
ui/avatar.jsView
@@ -1,0 +1,92 @@
1 +var pull = require('pull-stream')
2 +var query = require('./scuttlebot').query
3 +var h = require('hyperscript')
4 +var visualize = require('visualize-buffer')
5 +
6 +var avatar = require('ssb-avatar')
7 +
8 +var sbot = require('./scuttlebot')
9 +
10 +var config = require('./config')()
11 +
12 +var id = require('./keys').id
13 +
14 +var ref = require('ssb-ref')
15 +
16 +module.exports.name = function (key) {
17 +
18 + var avatarname = h('span', key.substring(0, 10))
19 + if (ref.isFeedId(key)) {
20 + avatar(sbot, id, key, function (err, data) {
21 + if (err) throw err
22 + if (data.name) {
23 + if (data.name[0] != '@') {
24 + var name = '@' + data.name
25 + } else {
26 + var name = data.name
27 + }
28 + localStorage[key + 'name'] = name
29 + avatarname.textContent = name
30 + }
31 + })
32 + }
33 + return avatarname
34 +}
35 +
36 +module.exports.image = function (key) {
37 + var img = visualize(new Buffer(key.substring(1), 'base64'), 256)
38 +
39 + if (ref.isFeedId(key)) {
40 + avatar(sbot, id, key, function (err, data) {
41 + if (err) throw err
42 + if (data.image) {
43 + localStorage[key + 'image'] = data.image
44 + img.src = config.blobsUrl + data.image
45 + }
46 + })
47 + }
48 + return img
49 +}
50 +
51 +module.exports.cachedName = function (key) {
52 + var avatarname = h('span', key.substring(0, 10))
53 +
54 + if (localStorage[key + 'name']) {
55 + avatarname.textContent = localStorage[key + 'name']
56 + } else {
57 + if (ref.isFeedId(key)) {
58 + avatar(sbot, id, key, function (err, data) {
59 + if (data.name) {
60 + if (data.name[0] != '@') {
61 + var name = '@' + data.name
62 + } else {
63 + var name = data.name
64 + }
65 + localStorage[key + 'name'] = name
66 + avatarname.textContent = name
67 + }
68 + })
69 + }
70 + }
71 +
72 + return avatarname
73 +}
74 +
75 +module.exports.cachedImage = function (key) {
76 + var img = visualize(new Buffer(key.substring(1), 'base64'), 256)
77 +
78 + if (localStorage[key + 'image']) {
79 + img.src = config.blobsUrl + localStorage[key + 'image']
80 + } else {
81 + if (ref.isFeedId(key)) {
82 + avatar(sbot, id, key, function (err, data) {
83 + if (data.image) {
84 + localStorage[key + 'image'] = data.image
85 + img.src = config.blobsUrl + data.image
86 + }
87 + })
88 + }
89 + }
90 +
91 + return img
92 +}
ui/compose.jsView
@@ -1,0 +1,187 @@
1 +var h = require('hyperscript')
2 +var pull = require('pull-stream')
3 +var sbot = require('./scuttlebot')
4 +var human = require('human-time')
5 +var id = require('./keys').id
6 +var mentions = require('ssb-mentions')
7 +
8 +var avatar = require('./avatar')
9 +var tools = require('./tools')
10 +
11 +var mime = require('simple-mime')('application/octect-stream')
12 +var split = require('split-buffer')
13 +
14 +var route = require('./views')
15 +
16 +function file_input (onAdded) {
17 + return h('label.btn', 'Upload file',
18 + h('input', { type: 'file', hidden: true,
19 + onchange: function (ev) {
20 + var file = ev.target.files[0]
21 + if (!file) return
22 + var reader = new FileReader()
23 + reader.onload = function () {
24 + pull(
25 + pull.values(split(new Buffer(reader.result), 64*1024)),
26 + sbot.addblob(function (err, blob) {
27 + if(err) return console.error(err)
28 + onAdded({
29 + link: blob,
30 + name: file.name,
31 + size: reader.result.length || reader.result.byteLength,
32 + type: mime(file.name)
33 + })
34 + })
35 + )
36 + }
37 + reader.readAsArrayBuffer(file)
38 + }
39 + }))
40 +}
41 +
42 +module.exports = function (opts, fallback) {
43 + var files = []
44 + var filesById = {}
45 +
46 + var composer = h('div.composer')
47 + var container = h('div.container')
48 + if (opts.boostAuthor) {
49 + var boostName = avatar.cachedName(opts.boostAuthor)
50 + }
51 + if (opts.boostContent) {
52 + var textarea = h('textarea.compose')
53 + var str = opts.boostContent
54 + var lines = str.split("\n")
55 + for(var i=0; i<lines.length; i++) {
56 + lines[i] = "> " + lines[i]
57 + }
58 + var newContent = lines.join("\n")
59 + var content = 'Boosting: ' + opts.boostKey + '\n\n' + newContent + ' - [' + boostName.textContent + ']('+ opts.boostAuthor + ')'
60 + textarea.value = content
61 + }
62 +
63 + else if (opts.mentions) {
64 + var textarea = h('textarea.compose', opts.mentions)
65 + }
66 +
67 + else if (opts.type == 'wiki')
68 + var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a wiki (anyone can edit)'})
69 + else if (opts.type == 'post')
70 + var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a message (only you can edit)'})
71 + else
72 + var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a message (only you can edit)'}, fallback.messageText)
73 +
74 + var cancelBtn = h('button.btn', 'Cancel', {
75 + onclick: function () {
76 + var cancel
77 + console.log(opts)
78 +
79 + if (opts.type == 'edit') {
80 + cancel = document.getElementById('edit:' + opts.branch.substring(0,44))
81 + var oldMessage = h('div.message__body', tools.markdown(fallback.messageText))
82 + cancel.parentNode.replaceChild(oldMessage, cancel)
83 + oldMessage.parentNode.appendChild(fallback.buttons)
84 + } else if (opts.branch) {
85 + //cancel reply composer
86 + cancel = document.getElementById('re:' + opts.branch.substring(0,44))
87 + cancel.parentNode.removeChild(cancel)
88 + message = document.getElementById(opts.branch.substring(0,44))
89 + message.appendChild(fallback.buttons)
90 + } else {
91 + // cancel generic composer
92 + cancel = document.getElementById('composer')
93 + cancel.parentNode.removeChild(cancel)
94 + }
95 + }
96 +
97 + })
98 +
99 + var initialButtons = h('span',
100 + h('button.btn', 'Preview', {
101 + onclick: function () {
102 + if (textarea.value) {
103 + var msg = {}
104 +
105 + msg.value = {
106 + "author": id,
107 + "content": opts
108 + }
109 +
110 + msg.value.content.text = textarea.value
111 + msg.value.content.mentions = mentions(textarea.value).map(
112 + function (mention) {
113 + var file = filesById[mention.link]
114 + if (file) {
115 + if (file.type) mention.type = file.type
116 + if (file.size) mention.size = file.size
117 + }
118 + return mention
119 + }
120 + )
121 +
122 + if (opts.recps)
123 + msg.value.private = true
124 +
125 + console.log(msg)
126 + if (opts.type == 'post' || opts.type == 'wiki')
127 + var header = tools.header(msg)
128 + if (opts.type == 'update')
129 + var header = tools.timestamp(msg, {edited: true})
130 + var preview = h('div',
131 + header,
132 + h('div.message__content', tools.markdown(msg.value.content.text)),
133 + h('button.btn', 'Publish', {
134 + onclick: function () {
135 + if (msg.value.content) {
136 + sbot.publish(msg.value.content, function (err, msg) {
137 + if(err) throw err
138 + console.log('Published!', msg)
139 + if (opts.type == 'edit') {
140 + var message = document.getElementById(opts.branch.substring(0,44))
141 + fallback.messageText = msg.value.content.text
142 + var editBody = h('div.message__body',
143 + tools.timestamp(msg, {edited: true}),
144 + h('div', tools.markdown(msg.value.content.text))
145 + )
146 +
147 + message.replaceChild(editBody, message.childNodes[message.childNodes.length - 1])
148 + editBody.parentNode.appendChild(fallback.buttons)
149 + } else {
150 + if (opts.branch)
151 + cancel = document.getElementById('re:' + opts.branch.substring(0,44))
152 + else
153 + cancel = document.getElementById('composer')
154 + cancel.parentNode.removeChild(cancel)
155 + }
156 + })
157 + }
158 + }
159 + }),
160 + h('button.btn', 'Cancel', {
161 + onclick: function () {
162 + composer.replaceChild(container, composer.firstChild)
163 + container.appendChild(textarea)
164 + container.appendChild(initialButtons)
165 + }
166 + })
167 + )
168 + composer.replaceChild(preview, composer.firstChild)
169 + }
170 + }
171 + }),
172 + file_input(function (file) {
173 + files.push(file)
174 + filesById[file.link] = file
175 + var embed = file.type.indexOf('image/') === 0 ? '!' : ''
176 + textarea.value += embed + '['+file.name+']('+file.link+')'
177 + }),
178 + cancelBtn
179 + )
180 +
181 + composer.appendChild(container)
182 + container.appendChild(textarea)
183 + container.appendChild(initialButtons)
184 +
185 + return composer
186 +}
187 +
ui/index.jsView
@@ -1,0 +1,81 @@
1 +var h = require('hyperscript')
2 +var route = require('./views')
3 +var avatar = require('./avatar')
4 +
5 +var compose = require('./compose')
6 +
7 +var id = require('./keys').id
8 +
9 +document.head.appendChild(h('style', require('./style.css.json')))
10 +
11 +var screen = h('div#screen')
12 +
13 +var search = h('input.search', {placeholder: 'Search'})
14 +
15 +var nav = h('div.navbar',
16 + h('div.internal',
17 + h('li', h('a', {href: '#' + id}, h('span.avatar--small', avatar.image(id)))),
18 + h('li', h('a', {href: '#' + id}, avatar.name(id))),
19 + h('li', h('a', 'New Post', {
20 + onclick: function () {
21 + if (document.getElementById('composer')) { return }
22 + else {
23 + var currentScreen = document.getElementById('screen')
24 + var opts = {}
25 + opts.type = 'post'
26 + var composer = h('div.content#composer', h('div.message', compose(opts)))
27 + if (currentScreen.firstChild.firstChild) {
28 + currentScreen.firstChild.insertBefore(composer, currentScreen.firstChild.firstChild)
29 + } else {
30 + currentScreen.firstChild.appendChild(composer)
31 + }
32 + }
33 + }
34 + })),
35 + h('li', h('a', 'New Wiki', {
36 + onclick: function () {
37 + if (document.getElementById('composer')) { return }
38 + else {
39 + var currentScreen = document.getElementById('screen')
40 + var opts = {}
41 + opts.type = 'wiki'
42 + var composer = h('div.content#composer', h('div.message', compose(opts)))
43 + if (currentScreen.firstChild.firstChild) {
44 + currentScreen.firstChild.insertBefore(composer, currentScreen.firstChild.firstChild)
45 + } else {
46 + currentScreen.firstChild.appendChild(composer)
47 + }
48 + }
49 + }
50 + })),
51 + h('li', h('a', {href: '#' }, 'All')),
52 + h('li', h('a', {href: '#private' }, 'Private')),
53 + h('li', h('a', {href: '#friends/' + id }, 'Friends')),
54 + h('li', h('a', {href: '#wall/' + id }, 'Wall')),
55 + h('li', h('a', {href: '#queue'}, 'Queue')),
56 + h('li', h('a', {href: '#key' }, 'Key')),
57 + h('li.right', h('a', {href: 'http://gitmx.com/#%NPNNvcnTMZUFZSWl/2Z4XX+YSdqsqOhyPacp+lgpQUw=.sha256'}, '?')),
58 + h('form.search', {
59 + onsubmit: function (e) {
60 + if (search.value[0] == '#')
61 + window.location.hash = '#' + search.value
62 + else
63 + window.location.hash = '?' + search.value
64 + e.preventDefault()
65 + }},
66 + search
67 + )
68 + )
69 +)
70 +
71 +document.body.appendChild(nav)
72 +document.body.appendChild(screen)
73 +route()
74 +
75 +window.onhashchange = function () {
76 + var oldscreen = document.getElementById('screen')
77 + var newscreen = h('div#screen')
78 + oldscreen.parentNode.replaceChild(newscreen, oldscreen)
79 + route()
80 +}
81 +
ui/keys.jsView
@@ -1,0 +1,6 @@
1 +
2 +var config = require('./config')()
3 +var ssbKeys = require('ssb-keys')
4 +var path = require('path')
5 +
6 +module.exports = ssbKeys.loadOrCreateSync(path.join(config.caps.shs + '/secret'))
ui/mvd-indexes.jsView
@@ -1,0 +1,20 @@
1 +var Indexes = require('flumeview-query/indexes')
2 +var pkg = require('./package.json')
3 +exports.name = 'mvd-indexes'
4 +exports.version = pkg.version
5 +exports.manifest = {}
6 +
7 +exports.init = function (sbot, config) {
8 +
9 + var view =
10 + sbot._flumeUse('query/mvd', Indexes(1, {
11 + indexes: [
12 + {key: 'chr', value: [['value', 'timestamp' ]]}
13 + ]
14 + }))
15 +
16 + var indexes = view.indexes()
17 + sbot.query.add(indexes[0])
18 +
19 + return {}
20 +}
ui/render.jsView
@@ -1,0 +1,430 @@
1 +var h = require('hyperscript')
2 +var pull = require('pull-stream')
3 +var human = require('human-time')
4 +
5 +var sbot = require('./scuttlebot')
6 +var composer = require('./compose')
7 +var tools = require('./tools')
8 +
9 +var config = require('./config')()
10 +var id = require('./keys').id
11 +var avatar = require('./avatar')
12 +var ssbAvatar = require('ssb-avatar')
13 +
14 +var ssbKeys = require('ssb-keys')
15 +var keys = require('./keys')
16 +
17 +var diff = require('diff')
18 +
19 +function hash () {
20 + return window.location.hash.substring(1)
21 +}
22 +
23 +module.exports = function (msg) {
24 + var message = h('div.message#' + msg.key.substring(0, 44))
25 +
26 + if (!localStorage[msg.value.author])
27 + var cache = {mute: false}
28 + else
29 + var cache = JSON.parse(localStorage[msg.value.author])
30 +
31 + if (cache.mute == true) {
32 + var muted = h('span', ' muted')
33 + message.appendChild(tools.mini(msg, muted))
34 + return message
35 + }
36 +
37 + else if (msg.value.content.type == 'about') {
38 + if (msg.value.content.image) {
39 + var image = h('span.avatar--small',
40 + ' identified ',
41 + h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
42 + ' as ',
43 + h('img', {src: config.blobsUrl + msg.value.content.image.link})
44 + )
45 + message.appendChild(tools.mini(msg, image))
46 + }
47 + if (msg.value.content.name) {
48 + var name = h('span',
49 + ' identified ',
50 + h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
51 + ' as ', msg.value.content.name
52 + )
53 + message.appendChild(tools.mini(msg, name))
54 + }
55 +
56 + return message
57 + }
58 +
59 + else if (msg.value.content.type == 'label'){
60 + var content = h('span', ' labeled ', tools.messageLink(msg.value.content.link), ' as ', h('mark', h('a', {href: '#label/' + msg.value.content.label}, msg.value.content.label)))
61 + message.appendChild(tools.mini(msg, content))
62 + return message
63 + }
64 +
65 + else if (msg.value.content.type == 'queue') {
66 + if (msg.value.content.queue == true) {
67 + var content = h('span', ' added ', tools.messageLink(msg.value.content.message), ' to their ', h('a', {href: '#queue'}, 'queue'))
68 + message.appendChild(tools.mini(msg, content))
69 + }
70 + if (msg.value.content.queue == false) {
71 + var content = h('span', ' removed ', tools.messageLink(msg.value.content.message), ' from their ', h('a', {href: '#queue'}, 'queue'))
72 + message.appendChild(tools.mini(msg, content))
73 +
74 + }
75 + return message
76 + }
77 +
78 + else if (msg.value.content.type == 'edit') {
79 + message.appendChild(tools.header(msg))
80 + if (msg.value.content.text) {
81 + var current = msg.value.content.text
82 + sbot.get(msg.value.content.updated, function (err, updated) {
83 + if (updated) {
84 + // quick fix, need to decrypt messages if they're private
85 + if (updated.content.text) {
86 + fragment = document.createDocumentFragment()
87 + var previous = updated.content.text
88 + var ready = diff.diffWords(previous, current)
89 + ready.forEach(function (part) {
90 + if (part.added === true) {
91 + color = 'cyan'
92 + } else if (part.removed === true) {
93 + color = 'gray'
94 + } else {color = '#333'}
95 + var span = h('span')
96 + span.style.color = color
97 + if (part.removed === true) {
98 + span.appendChild(h('del', document.createTextNode(part.value)))
99 + } else {
100 + span.appendChild(document.createTextNode(part.value))
101 + }
102 + fragment.appendChild(span)
103 + })
104 + message.appendChild(h('code', fragment))
105 + }
106 + }
107 + })
108 + }
109 + return message
110 + }
111 +
112 + else if (msg.value.content.type == 'scat_message') {
113 + var src = hash()
114 + if (src != 'backchannel') {
115 + message.appendChild(h('button.btn.right', h('a', {href: '#backchannel'}, 'Chat')))
116 + }
117 + message.appendChild(tools.mini(msg, ' ' + msg.value.content.text))
118 + return message
119 + }
120 + else if (msg.value.content.type == 'contact') {
121 + if (msg.value.content.contact) {
122 + var contact = h('a', {href: '#' + msg.value.content.contact}, avatar.name(msg.value.content.contact))
123 + } else { var contact = h('p', 'no contact named')}
124 +
125 + if (msg.value.content.following == true) {
126 + var following = h('span', ' follows ', contact)
127 + message.appendChild(tools.mini(msg, following))
128 + }
129 + if (msg.value.content.following == false) {
130 + var unfollowing = h('span', ' unfollows ', contact)
131 + message.appendChild(tools.mini(msg, unfollowing))
132 + }
133 + if (msg.value.content.blocking == true) {
134 + var blocking = h('span', ' blocks ', contact)
135 + message.appendChild(tools.mini(msg, blocking))
136 + }
137 + if (msg.value.content.blocking == false) {
138 + var unblocking = h('span', ' unblocks ', contact)
139 + message.appendChild(tools.mini(msg, unblocking))
140 + }
141 + return message
142 +
143 + }
144 +
145 + else if (msg.value.content.type == 'git-update') {
146 +
147 + message.appendChild(tools.header(msg))
148 +
149 + var reponame = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, msg.value.content.repo))
150 +
151 + var cloneurl = h('pre', 'git clone ssb://' + msg.value.content.repo)
152 +
153 + message.appendChild(reponame)
154 +
155 +
156 + ssbAvatar(sbot, id, msg.value.content.repo, function (err, data) {
157 + if (data) {
158 + var actualname = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, '%' + data.name))
159 + reponame.parentNode.replaceChild(actualname, reponame)
160 + }
161 + })
162 +
163 + message.appendChild(cloneurl)
164 +
165 + var commits = h('ul')
166 + //if (msg.value.content.commits[0]) {
167 + if (msg.value.content.commits) {
168 + msg.value.content.commits.map(function (commit) {
169 + commits.appendChild(h('li', h('code', commit.sha1), ' - ', commit.title))
170 + })
171 +
172 + }
173 +
174 + message.appendChild(commits)
175 +
176 + return message
177 +
178 + }
179 + else if (msg.value.content.type == 'git-repo') {
180 + message.appendChild(tools.header(msg))
181 +
182 + var reponame = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, msg.key))
183 +
184 + message.appendChild(reponame)
185 +
186 + ssbAvatar(sbot, id, msg.key, function (err, data) {
187 + if (data)
188 + var actualname = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, '%' + data.name))
189 + reponame.parentNode.replaceChild(actualname, reponame)
190 + })
191 +
192 + var cloneurl = h('pre', 'git clone ssb://' + msg.key)
193 + message.appendChild(cloneurl)
194 + return message
195 + }
196 +
197 + else if (msg.value.content.type == 'wiki') {
198 + var fallback = {}
199 +
200 + var opts = {
201 + type: 'wiki',
202 + branch: msg.key
203 + }
204 +
205 + if (msg.value.content.root)
206 + opts.root = msg.value.content.root
207 + else
208 + opts.root = msg.key
209 +
210 + message.appendChild(tools.header(msg))
211 +
212 + message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
213 +
214 + pull(
215 + sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
216 + pull.drain(function (update) {
217 + if (update.sync) {
218 + } else {
219 + var newMessage = h('div', tools.markdown(update.value.content.text))
220 + var latest = h('div.message__body',
221 + tools.timestamp(update, {edited: true}),
222 + newMessage
223 + )
224 + message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
225 + fallback.messageText = update.value.content.text
226 + opts.updated = update.key
227 + opts.original = msg.key
228 + }
229 + })
230 + )
231 +
232 + var buttons = h('div.buttons')
233 +
234 + buttons.appendChild(h('button.btn', 'Edit wiki', {
235 + onclick: function () {
236 + opts.type = 'edit'
237 + if (!fallback.messageText)
238 + fallback.messageText = msg.value.content.text
239 +
240 + if (!opts.updated)
241 + opts.updated = msg.key
242 + opts.original = msg.key
243 +
244 + var r = message.childNodes.length - 1
245 + fallback.buttons = message.childNodes[r]
246 + message.removeChild(message.childNodes[r])
247 + var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
248 + message.replaceChild(compose, message.lastElementChild)
249 + }
250 + }))
251 +
252 + buttons.appendChild(tools.star(msg))
253 + message.appendChild(buttons)
254 + return message
255 +
256 + } else if (msg.value.content.type == 'post') {
257 + var opts = {
258 + type: 'post',
259 + branch: msg.key
260 + }
261 + var fallback = {}
262 +
263 +
264 + if (msg.value.content.root)
265 + opts.root = msg.value.content.root
266 + else
267 + opts.root = msg.key
268 +
269 + message.appendChild(tools.header(msg))
270 +
271 + if (msg.value.content.root)
272 + message.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root)))
273 +
274 + message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
275 +
276 + pull(
277 + sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
278 + pull.drain(function (update) {
279 + if (update.sync) {
280 + } else {
281 + var newMessage = h('div', tools.markdown(update.value.content.text))
282 + var latest = h('div.message__body',
283 + tools.timestamp(update, {edited: true}),
284 + newMessage
285 + )
286 + message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
287 + fallback.messageText = update.value.content.text
288 + opts.updated = update.key
289 + opts.original = msg.key
290 + }
291 + })
292 + )
293 +
294 + pull(
295 + sbot.query({query: [{$filter: {value: { content: {type: 'label', link: msg.key}}}}], limit: 100, live: true}),
296 + pull.drain(function (labels){
297 + console.log(labels)
298 + if (labels.value){
299 + message.appendChild(h('span', ' ', h('mark', h('a', {href: '#label/' + labels.value.content.label}, labels.value.content.label))))
300 +
301 + }
302 + })
303 + )
304 +
305 + var name = avatar.name(msg.value.author)
306 +
307 + var buttons = h('div.buttons')
308 +
309 + buttons.appendChild(h('button.btn', 'Reply', {
310 + onclick: function () {
311 + opts.type = 'post'
312 + opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
313 + if (msg.value.content.recps) {
314 + opts.recps = msg.value.content.recps
315 + }
316 + var r = message.childNodes.length - 1
317 + delete opts.updated
318 + delete opts.original
319 + delete fallback.messageText
320 + fallback.buttons = message.childNodes[r]
321 + var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
322 + message.removeChild(message.childNodes[r])
323 + message.parentNode.insertBefore(compose, message.nextSibling)
324 + }
325 + }))
326 +
327 + buttons.appendChild(h('button.btn', 'Boost', {
328 + onclick: function () {
329 + opts.type = 'post'
330 + opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
331 + if (msg.value.content.recps) {
332 + opts.recps = msg.value.content.recps
333 + }
334 + var r = message.childNodes.length - 1
335 + delete opts.updated
336 + delete opts.original
337 + delete fallback.messageText
338 + opts.boostContent = msg.value.content.text
339 + opts.boostKey = msg.key
340 + opts.boostAuthor = msg.value.author
341 + fallback.buttons = message.childNodes[r]
342 + var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
343 + message.removeChild(message.childNodes[r])
344 + message.parentNode.insertBefore(compose, message.nextSibling)
345 + }
346 + }))
347 +
348 +
349 + if (msg.value.author == id)
350 + buttons.appendChild(h('button.btn', 'Edit', {
351 + onclick: function () {
352 + opts.type = 'edit'
353 + if (!fallback.messageText)
354 + fallback.messageText = msg.value.content.text
355 +
356 + if (!opts.updated)
357 + opts.updated = msg.key
358 + opts.original = msg.key
359 +
360 + var r = message.childNodes.length - 1
361 + fallback.buttons = message.childNodes[r]
362 + message.removeChild(message.childNodes[r])
363 + var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
364 + message.replaceChild(compose, message.lastElementChild)
365 + }
366 + }))
367 +
368 +
369 + var inputter = h('input', {placeholder: 'Add a label to this post ie art, books, new'})
370 +
371 + var labeler = h('div',
372 + inputter,
373 + h('button.btn', 'Publish label', {
374 + onclick: function () {
375 + var post = {}
376 + post.type = 'label',
377 + post.label = inputter.value,
378 + post.link = msg.key
379 +
380 + sbot.publish(post, function (err, msg){
381 + console.log(msg)
382 + labeler.parentNode.replaceChild(buttons, labeler)
383 + })
384 + }
385 + })
386 + )
387 +
388 + var labels = h('button.btn', 'Add label', {
389 + onclick: function () {
390 + buttons.parentNode.replaceChild(labeler, buttons)
391 + }
392 + })
393 +
394 + buttons.appendChild(labels)
395 + buttons.appendChild(tools.queueButton(msg))
396 + buttons.appendChild(tools.star(msg))
397 + message.appendChild(buttons)
398 + return message
399 +
400 + } else if (msg.value.content.type == 'vote') {
401 + if (msg.value.content.vote.value == 1)
402 + var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'star.png'}), ' ', h('a', {href: '#' + msg.value.content.vote.link}, tools.messageLink(msg.value.content.vote.link)))
403 + else if (msg.value.content.vote.value == -1)
404 + var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'stars.png'}), ' ', h('a', {href: '#' + msg.value.content.vote.link}, tools.messageLink(msg.value.content.vote.link)))
405 + message.appendChild(tools.mini(msg, link))
406 + return message
407 + } else if (typeof msg.value.content === 'string') {
408 + var unboxed = ssbKeys.unbox(msg.value.content, keys)
409 + if (unboxed) {
410 + msg.value.content = unboxed
411 + msg.value.private = true
412 + return module.exports(msg)
413 + } else {
414 + var privateMsg = h('span', ' sent a private message.')
415 + message.appendChild(tools.mini(msg, privateMsg))
416 + return message
417 + //return h('div')
418 + }
419 + } else {
420 +
421 + //FULL FALLBACK
422 + message.appendChild(tools.header(msg))
423 + message.appendChild(h('pre', tools.rawJSON(msg.value)))
424 +
425 + //MINI FALLBACK
426 + //var fallback = h('span', ' ' + msg.value.content.type)
427 + //message.appendChild(tools.mini(msg, fallback))
428 + return h('div', message)
429 + }
430 +}
ui/style.cssView
@@ -1,0 +1,302 @@
1 +body {
2 + margin: 0;
3 + background: black;
4 + font-family: sans-serif;
5 + color: #f5f5f5;
6 + font-size: 14px;
7 + line-height: 20px;
8 +}
9 +
10 +#screen {
11 + position: absolute;
12 + top: 35px;
13 + bottom: 0px;
14 + left: 0px;
15 + right: 0px;
16 +}
17 +
18 +.hyperscroll {
19 + width: 100%;
20 +}
21 +
22 +.search {
23 + margin-top: 1.5px;
24 + float: right;
25 + width: 200px;
26 +}
27 +
28 +.header {
29 + padding-bottom: .7em;
30 + border-bottom: 1px solid #252525;
31 +}
32 +
33 +mark p, mark a {
34 + color: black;
35 +}
36 +
37 +h1, h2, h3, h4, h5, h6 {
38 + font-size: 1.2em;
39 + margin-top: .35ex;
40 +}
41 +
42 +hr {
43 + border: solid #222;
44 + clear: both;
45 + border-width: 1px 0 0;
46 + height: 0;
47 + margin-bottom: .9em;
48 +}
49 +
50 +
51 +p {
52 + margin-top: .35ex;
53 + margin-bottom: 10px;
54 +}
55 +
56 +a {
57 + color: cyan;
58 + text-decoration: none;
59 +}
60 +
61 +a:hover, a:focus {
62 + color: violet;
63 + text-decoration: underline;
64 +}
65 +
66 +.breadcrumbs {
67 + color: #363636;
68 + background: #f5f5f5;
69 +}
70 +
71 +/*.navbar a {
72 + color: #999;
73 + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
74 + text-decoration: none;
75 +}
76 +
77 +.navbar a:hover, .navbar a:focus {
78 + color: #fff;
79 + text-decoration: none;
80 +}*/
81 +
82 +.navbar {
83 + background: #1b1b1b;
84 + background: linear-gradient(#222, #111);
85 + border-bottom: 1px solid #252525;
86 +}
87 +
88 +.navbar {
89 + width: 100%;
90 + position: fixed;
91 + z-index: 1000;
92 + margin: 0;
93 + padding-top: .3em;
94 + padding-bottom: .3em;
95 + left: 0; right: 0;
96 + top: 0;
97 +}
98 +
99 +.navbar .internal {
100 + max-width: 97%;
101 + margin-left: auto;
102 + margin-right: auto;
103 +}
104 +
105 +.navbar li {
106 + margin-top: .3em;
107 + float: left;
108 + margin-right: .6em;
109 + margin-left: .3em;
110 + list-style-type: none;
111 +}
112 +
113 +.navbar li.right {
114 + padding-left: .4em;
115 + padding-right: .4em;
116 + margin-top: .3em;
117 + margin-right: 1.7em;
118 + float: right;
119 + list-style-type: none;
120 + background: #333;
121 + border-radius: 100%;
122 +}
123 +
124 +.content {
125 + max-width: 680px;
126 + margin-left: auto;
127 + margin-right: auto;
128 +}
129 +
130 +.hyperscroll > .content {
131 + max-width: 680px;
132 + margin-left: auto;
133 + margin-right: auto;
134 +}
135 +
136 +.message, .message > *, .navbar, .navbar > * {
137 + animation: fadein .5s;
138 +}
139 +
140 +@keyframes fadein {
141 + from { opacity: 0; }
142 + to { opacity: 1; }
143 +}
144 +
145 +.message {
146 + display: block;
147 + margin: .6em;
148 + background: #111;
149 + padding: .7em;
150 + border-radius: 3px;
151 + border: 1px solid #252525;
152 +}
153 +
154 +.message:hover, .embedded:hover {
155 + background: #141414;
156 +}
157 +
158 +.message img, .message video {
159 + max-width: 100%;
160 +}
161 +
162 +img {
163 + border-radius: 3px;
164 +}
165 +
166 +.timestamp, .votes {
167 + float: right;
168 +}
169 +
170 +.avatar--small img {
171 + vertical-align: top;
172 + width: 1.4em;
173 + height: 1.4em;
174 + margin-right: .2em;
175 +}
176 +
177 +.avatar--medium img {
178 + float: left;
179 + vertical-align: top;
180 + width: 5em;
181 + height: 5em;
182 + margin-right: .5em;
183 + margin-bottom: .5em;
184 +}
185 +
186 +.compose, textarea, input {
187 + font-family: sans-serif;
188 + font-size: 14px;
189 + line-height: 20px;
190 + background: #111;
191 + color: #ccc;
192 + border: none;
193 + border-radius: 3px;
194 +}
195 +
196 +textarea {
197 + width: 100%;
198 + height: 200px;
199 +}
200 +
201 +.compose:hover {
202 + background: #141414;
203 +}
204 +
205 +.compose:focus {
206 + outline: none;
207 +}
208 +
209 +.emoji {
210 + padding: .2em;
211 +}
212 +
213 +.right {
214 + float: right;
215 + margin-right: .25em;
216 +}
217 +
218 +.emoji {
219 + *float: left;
220 + width: 1em;
221 + vertical-align: top;
222 +}
223 +
224 +pre {
225 + width: 100%;
226 + display: block;
227 +}
228 +
229 +code {
230 + display: inline-block;
231 + vertical-align: bottom;
232 +}
233 +
234 +code, pre {
235 +overflow: auto;
236 +word-break: break-all;
237 +word-wrap: break-word;
238 +white-space: pre;
239 +white-space: -moz-pre-wrap;
240 +white-space: pre-wrap;
241 +white-space: pre\9;
242 +}
243 +
244 +code, pre {
245 + font-size: 12px;
246 + color: #ccc;
247 +}
248 +
249 +code {
250 + color: #ccc;
251 +}
252 +
253 +pre {
254 + margin: 0 0 10px;
255 + font-size: 13px;
256 + line-height: 20px;
257 +}
258 +
259 +button {margin: 0; margin-top: -.2em;}
260 +
261 +input {width: 88%; }
262 +
263 +#profile input {width: 50%;}
264 +
265 +.btn {
266 + display: inline-block;
267 + *display: inline;
268 + padding: 2px 6px;
269 + margin-bottom: 0;
270 + margin-right: .2em;
271 + font-size: 14px;
272 + line-height: 20px;
273 + color: #d5d5d5;
274 + text-align: center;
275 + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
276 + vertical-align: middle;
277 + cursor: pointer;
278 + background-color: #222;
279 + border: 1px solid #222;
280 + border-radius: 4px;
281 +}
282 +
283 +
284 +.btn:hover,
285 +.btn:focus,
286 +.btn:active,
287 +.btn.active,
288 +.btn.disabled,
289 +.btn[disabled] {
290 + color: white;
291 + background-color: black;
292 +}
293 +
294 +.btn:active,
295 +.btn.active {
296 + background-color: #111;
297 +}
298 +
299 +.btn:first-child {
300 + *margin-left: 0;
301 +}
302 +
ui/style.css.jsonView
@@ -1,0 +1,1 @@
1 +"body {\n margin: 0;\n background: black;\n font-family: sans-serif;\n color: #f5f5f5;\n font-size: 14px; \n line-height: 20px;\n}\n\n#screen {\n position: absolute;\n top: 35px;\n bottom: 0px;\n left: 0px;\n right: 0px;\n}\n\n.hyperscroll {\n width: 100%;\n}\n\n.search {\n margin-top: 1.5px;\n float: right;\n width: 200px;\n}\n\n.header {\n padding-bottom: .7em;\n border-bottom: 1px solid #252525;\n}\n\nmark p, mark a {\n color: black;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-size: 1.2em;\n margin-top: .35ex;\n}\n\nhr {\n border: solid #222;\n clear: both;\n border-width: 1px 0 0;\n height: 0;\n margin-bottom: .9em;\n}\n\n\np {\n margin-top: .35ex;\n margin-bottom: 10px;\n}\n\na {\n color: cyan;\n text-decoration: none;\n}\n\na:hover, a:focus {\n color: violet;\n text-decoration: underline; \n}\n\n.breadcrumbs {\n color: #363636;\n background: #f5f5f5;\n}\n\n/*.navbar a {\n color: #999;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n text-decoration: none;\n}\n\n.navbar a:hover, .navbar a:focus {\n color: #fff;\n text-decoration: none;\n}*/\n\n.navbar {\n background: #1b1b1b;\n background: linear-gradient(#222, #111);\n border-bottom: 1px solid #252525;\n}\n\n.navbar {\n width: 100%;\n position: fixed;\n z-index: 1000;\n margin: 0;\n padding-top: .3em;\n padding-bottom: .3em;\n left: 0; right: 0;\n top: 0;\n}\n\n.navbar .internal {\n max-width: 97%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.navbar li {\n margin-top: .3em;\n float: left;\n margin-right: .6em;\n margin-left: .3em;\n list-style-type: none;\n}\n\n.navbar li.right {\n padding-left: .4em;\n padding-right: .4em;\n margin-top: .3em;\n margin-right: 1.7em;\n float: right;\n list-style-type: none;\n background: #333;\n border-radius: 100%;\n}\n\n.content {\n max-width: 680px;\n margin-left: auto;\n margin-right: auto;\n}\n\n.hyperscroll > .content {\n max-width: 680px;\n margin-left: auto;\n margin-right: auto;\n}\n\n.message, .message > *, .navbar, .navbar > * {\n animation: fadein .5s;\n}\n\n@keyframes fadein {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.message {\n display: block;\n margin: .6em;\n background: #111;\n padding: .7em;\n border-radius: 3px;\n border: 1px solid #252525;\n}\n\n.message:hover, .embedded:hover {\n background: #141414;\n}\n\n.message img, .message video {\n max-width: 100%;\n}\n\nimg {\n border-radius: 3px;\n}\n\n.timestamp, .votes {\n float: right;\n}\n \n.avatar--small img {\n vertical-align: top;\n width: 1.4em;\n height: 1.4em;\n margin-right: .2em;\n}\n\n.avatar--medium img {\n float: left;\n vertical-align: top;\n width: 5em;\n height: 5em;\n margin-right: .5em;\n margin-bottom: .5em;\n}\n\n.compose, textarea, input {\n font-family: sans-serif;\n font-size: 14px;\n line-height: 20px;\n background: #111;\n color: #ccc;\n border: none;\n border-radius: 3px;\n}\n\ntextarea {\n width: 100%;\n height: 200px;\n}\n\n.compose:hover {\n background: #141414;\n}\n\n.compose:focus {\n outline: none;\n}\n\n.emoji {\n padding: .2em;\n}\n\n.right {\n float: right;\n margin-right: .25em;\n}\n\n.emoji {\n *float: left;\n width: 1em;\n vertical-align: top;\n}\n\npre {\n width: 100%;\n display: block;\n}\n\ncode {\n display: inline-block;\n vertical-align: bottom;\n}\n\ncode, pre {\noverflow: auto;\nword-break: break-all;\nword-wrap: break-word;\nwhite-space: pre;\nwhite-space: -moz-pre-wrap;\nwhite-space: pre-wrap;\nwhite-space: pre\\9;\n}\n\ncode, pre {\n font-size: 12px;\n color: #ccc;\n}\n\ncode {\n color: #ccc;\n}\n\npre {\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 20px;\n}\n\nbutton {margin: 0; margin-top: -.2em;}\n\ninput {width: 88%; }\n\n#profile input {width: 50%;}\n\n.btn {\n display: inline-block;\n *display: inline;\n padding: 2px 6px;\n margin-bottom: 0;\n margin-right: .2em;\n font-size: 14px;\n line-height: 20px;\n color: #d5d5d5;\n text-align: center;\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);\n vertical-align: middle;\n cursor: pointer;\n background-color: #222;\n border: 1px solid #222;\n border-radius: 4px;\n}\n\n\n.btn:hover,\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n color: white;\n background-color: black;\n}\n\n.btn:active,\n.btn.active {\n background-color: #111;\n}\n\n.btn:first-child {\n *margin-left: 0;\n}\n\n"
ui/style.jsView
@@ -1,0 +1,8 @@
1 +var fs = require('fs')
2 +var path = require('path')
3 +
4 +fs.writeFileSync(
5 + path.join(__dirname, 'style.css.json'),
6 + JSON.stringify(fs.readFileSync(path.join(__dirname, 'style.css'), 'utf8'))
7 +)
8 +
ui/tools.jsView
@@ -1,0 +1,596 @@
1 +var h = require('hyperscript')
2 +var human = require('human-time')
3 +var avatar = require('./avatar')
4 +var ref = require('ssb-ref')
5 +
6 +var ssbKeys = require('ssb-keys')
7 +
8 +var pull = require('pull-stream')
9 +
10 +var sbot = require('./scuttlebot')
11 +
12 +var config = require('./config')()
13 +
14 +var id = require('./keys').id
15 +
16 +
17 +module.exports.getBlocks = function (src) {
18 + var blocks = h('div.blocks', 'Blocking: ')
19 +
20 + pull(
21 + sbot.query({query: [{$filter: { value: { author: src, content: {type: 'contact'}}}}], live: true}),
22 + pull.drain(function (msg) {
23 + if (msg.value) {
24 + if (msg.value.content.blocking == true) {
25 + console.log(msg.value)
26 + var gotIt = document.getElementById('blocks:' + msg.value.content.contact.substring(0, 44))
27 + if (gotIt == null) {
28 + blocks.appendChild(h('a#blocks:'+ msg.value.content.contact.substring(0, 44), {title: avatar.cachedName(msg.value.content.contact).textContent, href: '#' + msg.value.content.contact}, h('span.avatar--small', avatar.cachedImage(msg.value.content.contact))))
29 + }
30 + }
31 + if (msg.value.content.blocking == false) {
32 + var gotIt = document.getElementById('blocks:' + msg.value.content.contact.substring(0, 44))
33 + if (gotIt != null) {
34 + gotIt.outerHTML = ''
35 + }
36 + }
37 + }
38 + })
39 + )
40 +
41 + return blocks
42 +
43 +}
44 +
45 +module.exports.getBlocked = function (src) {
46 + var blocked = h('div.blocked', 'Blocked by: ')
47 +
48 + pull(
49 + sbot.query({query: [{$filter: { value: { content: {type: 'contact', contact: src}}}}], live: true}),
50 + pull.drain(function (msg) {
51 + if (msg.value) {
52 + if (msg.value.content.blocking == true) {
53 + console.log(msg.value)
54 + var gotIt = document.getElementById('blocked:' + msg.value.content.contact.substring(0, 44))
55 + if (gotIt == null) {
56 + blocked.appendChild(h('a#blocked:'+ msg.value.author.substring(0, 44), {title: avatar.cachedName(msg.value.author).textContent, href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))))
57 + }
58 + }
59 + if (msg.value.content.blocking == false) {
60 + var gotIt = document.getElementById('blocked:' + msg.value.author.substring(0, 44))
61 + if (gotIt != null) {
62 + gotIt.outerHTML = ''
63 + }
64 + }
65 + }
66 + })
67 + )
68 +
69 + return blocked
70 +
71 +}
72 +
73 +module.exports.getFollowing = function (src) {
74 + var followingCount = 0
75 +
76 + var following = h('div.following', 'Following: ')
77 +
78 + following.appendChild(h('span#followingcount', '0'))
79 + following.appendChild(h('br'))
80 +
81 + pull(
82 + sbot.query({query: [{$filter: { value: { author: src, content: {type: 'contact'}}}}], live: true}),
83 + pull.drain(function (msg) {
84 + if (msg.value) {
85 + if (msg.value.content.following == true) {
86 + followingcount = document.getElementById('followingcount')
87 + followingCount++
88 + followingcount.textContent = followingCount
89 + var gotIt = document.getElementById('following:' + msg.value.content.contact.substring(0, 44))
90 + if (gotIt == null) {
91 + following.appendChild(h('a#following:'+ msg.value.content.contact.substring(0, 44), {title: avatar.cachedName(msg.value.content.contact).textContent, href: '#' + msg.value.content.contact}, h('span.avatar--small', avatar.cachedImage(msg.value.content.contact))))
92 + }
93 + }
94 + if (msg.value.content.following == false) {
95 + followingcount = document.getElementById('followingcount')
96 + followingCount--
97 + followingcount.textContent = followingCount
98 + var gotIt = document.getElementById('following:' + msg.value.content.contact.substring(0, 44))
99 + if (gotIt != null) {
100 + gotIt.outerHTML = ''
101 + }
102 + }
103 + }
104 + })
105 + )
106 + return following
107 +}
108 +
109 +module.exports.getFollowers = function (src) {
110 + var followerCount = 0
111 +
112 + var followers = h('div.followers', 'Followers: ')
113 +
114 + followers.appendChild(h('span#followercount', '0'))
115 + followers.appendChild(h('br'))
116 +
117 + pull(
118 + sbot.query({query: [{$filter: { value: { content: {type: 'contact', contact: src}}}}], live: true}),
119 + pull.drain(function (msg) {
120 + if (msg.value) {
121 + if (msg.value.content.following == true) {
122 + followcount = document.getElementById('followercount')
123 + followerCount++
124 + followcount.textContent = followerCount
125 + var gotIt = document.getElementById('followers:' + msg.value.author.substring(0, 44))
126 + if (gotIt == null) {
127 + followers.appendChild(h('a#followers:'+ msg.value.author.substring(0, 44), {title: avatar.cachedName(msg.value.author).textContent, href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))))
128 + }
129 + }
130 + if (msg.value.content.following == false) {
131 + followcount = document.getElementById('followercount')
132 + followerCount--
133 + followcount.textContent = followerCount
134 + var gotIt = document.getElementById('followers:' + msg.value.author.substring(0, 44))
135 + if (gotIt != null) {
136 + gotIt.outerHTML = ''
137 + }
138 + }
139 + }
140 + })
141 + )
142 +
143 + return followers
144 +}
145 +
146 +module.exports.queueButton = function (src) {
147 + var queueButton = h('span.queue:' + src.key.substring(0,44))
148 +
149 + var addToQueue = h('button.btn.right', 'Queue', {
150 + onclick: function () {
151 + var content = {
152 + type: 'queue',
153 + message: src.key,
154 + queue: true
155 + }
156 + sbot.publish(content, function (err, publish) {
157 + if (err) throw err
158 + console.log(publish)
159 + })
160 + }
161 + })
162 +
163 + var removeFromQueue = h('button.btn.right#', 'Done', {
164 + onclick: function () {
165 + var content = {
166 + type: 'queue',
167 + message: src.key,
168 + queue: false
169 + }
170 + sbot.publish(content, function (err, publish) {
171 + if (err) throw err
172 + console.log(publish)
173 + if (window.location.hash.substring(1) == 'queue') {
174 + setTimeout(function () {
175 + var gotIt = document.getElementById(src.key.substring(0,44))
176 + if (gotIt != null) {
177 + gotIt.outerHTML = ''
178 + }
179 + }, 100)
180 +
181 + }
182 + })
183 + }
184 + })
185 +
186 + pull(
187 + sbot.query({query: [{$filter: { value: { author: id, content: {type: 'queue', message: src.key}}}}], live: true}),
188 + pull.drain(function (msg) {
189 + if (msg.value) {
190 + if (msg.value.content.queue == true) {
191 + queueButton.removeChild(queueButton.childNodes[0])
192 + queueButton.appendChild(removeFromQueue)
193 + }
194 + if (msg.value.content.queue == false) {
195 + queueButton.removeChild(queueButton.childNodes[0])
196 + queueButton.appendChild(addToQueue)
197 + }
198 + }
199 + })
200 + )
201 +
202 + queueButton.appendChild(addToQueue)
203 +
204 + return queueButton
205 +}
206 +module.exports.block = function (src) {
207 + var button = h('span.button')
208 +
209 + var followButton = h('button.btn', 'Block (Private)', avatar.name(src), {
210 + onclick: function () {
211 + var content = {
212 + type: 'contact',
213 + contact: src,
214 + blocking: true,
215 + recps: id
216 + }
217 + sbot.publish(content, function (err, publish) {
218 + if (err) throw err
219 + console.log(publish)
220 + })
221 + }
222 + })
223 +
224 + var unfollowButton = h('button.btn', 'Unblock (Private)', avatar.name(src), {
225 + onclick: function () {
226 + var content = {
227 + type: 'contact',
228 + contact: src,
229 + blocking: false,
230 + recps: id
231 + }
232 + sbot.publish(content, function (err, publish) {
233 + if (err) throw err
234 + console.log(publish)
235 + })
236 + }
237 + })
238 +
239 + pull(
240 + sbot.query({query: [{$filter: { value: { author: id, content: {type: 'contact', contact: src}}}}], live: true}),
241 + pull.drain(function (msg) {
242 + if (msg.value) {
243 + if (msg.value.content.blocking == true) {
244 + button.removeChild(button.firstChild)
245 + button.appendChild(unfollowButton)
246 + }
247 + if (msg.value.content.blocking == false) {
248 + button.removeChild(button.firstChild)
249 + button.appendChild(followButton)
250 + }
251 + }
252 + })
253 + )
254 +
255 + button.appendChild(followButton)
256 +
257 + return button
258 +}
259 +
260 +module.exports.box = function (content) {
261 + return ssbKeys.box(content, content.recps.map(function (e) {
262 + return ref.isFeed(e) ? e : e.link
263 + }))
264 +}
265 +
266 +module.exports.publish = function (content, cb) {
267 + if(content.recps)
268 + content = exports.box(content)
269 + sbot.publish(content, function (err, msg) {
270 + if(err) throw err
271 + console.log('Published!', msg)
272 + if(cb) cb(err, msg)
273 + })
274 +}
275 +
276 +
277 +
278 +module.exports.follow = function (src) {
279 + var button = h('span.button')
280 +
281 + var followButton = h('button.btn', 'Follow ', avatar.name(src), {
282 + onclick: function () {
283 + var content = {
284 + type: 'contact',
285 + contact: src,
286 + following: true
287 + }
288 + sbot.publish(content, function (err, publish) {
289 + if (err) throw err
290 + console.log(publish)
291 + })
292 + }
293 + })
294 +
295 + var unfollowButton = h('button.btn', 'Unfollow ', avatar.name(src), {
296 + onclick: function () {
297 + var content = {
298 + type: 'contact',
299 + contact: src,
300 + following: false
301 + }
302 + sbot.publish(content, function (err, publish) {
303 + if (err) throw err
304 + console.log(publish)
305 + })
306 + }
307 + })
308 +
309 + pull(
310 + sbot.query({query: [{$filter: { value: { author: id, content: {type: 'contact', contact: src}}}}], live: true}),
311 + pull.drain(function (msg) {
312 + if (msg.value) {
313 + if (msg.value.content.following == true) {
314 + button.removeChild(button.firstChild)
315 + button.appendChild(unfollowButton)
316 + }
317 + if (msg.value.content.following == false) {
318 + button.removeChild(button.firstChild)
319 + button.appendChild(followButton)
320 + }
321 + }
322 + })
323 + )
324 +
325 + button.appendChild(followButton)
326 +
327 + return button
328 +}
329 +
330 +module.exports.box = function (content) {
331 + return ssbKeys.box(content, content.recps.map(function (e) {
332 + return ref.isFeed(e) ? e : e.link
333 + }))
334 +}
335 +
336 +module.exports.publish = function (content, cb) {
337 + if(content.recps)
338 + content = exports.box(content)
339 + sbot.publish(content, function (err, msg) {
340 + if(err) throw err
341 + console.log('Published!', msg)
342 + if(cb) cb(err, msg)
343 + })
344 +}
345 +
346 +
347 +
348 +module.exports.mute = function (src) {
349 + if (!localStorage[src])
350 + var cache = {mute: false}
351 + else
352 + var cache = JSON.parse(localStorage[src])
353 +
354 + if (cache.mute == true) {
355 + var mute = h('button.btn', 'Unmute', {
356 + onclick: function () {
357 + cache.mute = false
358 + localStorage[src] = JSON.stringify(cache)
359 + location.hash = '#'
360 + location.hash = src
361 + }
362 + })
363 + return mute
364 + } else {
365 + var mute = h('button.btn', 'Mute', {
366 + onclick: function () {
367 + cache.mute = true
368 + localStorage[src] = JSON.stringify(cache)
369 + location.hash = '#'
370 + location.hash = src
371 + }
372 + })
373 + return mute
374 + }
375 +}
376 +
377 +module.exports.star = function (msg) {
378 + var votebutton = h('span.star:' + msg.key.substring(0,44))
379 +
380 + var vote = {
381 + type: 'vote',
382 + vote: { link: msg.key, expression: 'Star' }
383 + }
384 +
385 + if (msg.value.content.recps) {
386 + vote.recps = msg.value.content.recps
387 + }
388 +
389 + var star = h('button.btn.right', 'Star ',
390 + h('img.emoji', {src: config.emojiUrl + 'star.png'}), {
391 + onclick: function () {
392 + vote.vote.value = 1
393 + if (vote.recps) {
394 + vote = exports.box(vote)
395 + }
396 + sbot.publish(vote, function (err, voted) {
397 + if(err) throw err
398 + })
399 + }
400 + }
401 + )
402 +
403 + var unstar = h('button.btn.right ', 'Unstar ',
404 + h('img.emoji', {src: config.emojiUrl + 'stars.png'}), {
405 + onclick: function () {
406 + vote.vote.value = -1
407 + sbot.publish(vote, function (err, voted) {
408 + if(err) throw err
409 + })
410 + }
411 + }
412 + )
413 +
414 + votebutton.appendChild(star)
415 +
416 + pull(
417 + sbot.links({rel: 'vote', dest: msg.key, live: true}),
418 + pull.drain(function (link) {
419 + if (link.key) {
420 + sbot.get(link.key, function (err, data) {
421 + if (err) throw err
422 + if (data.content.vote) {
423 + if (data.author == id) {
424 + while (votebutton.firstChild) {
425 + votebutton.removeChild(votebutton.firstChild)
426 + }
427 + if (data.content.vote.value == 1)
428 + //votebutton.removeChild(votebutton.childNodes[0])
429 + votebutton.appendChild(unstar)
430 + if (data.content.vote.value == -1)
431 + //votebutton.removeChild(votebutton.childNodes[0])
432 + votebutton.appendChild(star)
433 + }
434 + }
435 + })
436 + }
437 + })
438 + )
439 +
440 + return votebutton
441 +}
442 +
443 +function votes (msg) {
444 + var votes = h('div.votes.right')
445 + if (msg.key) {
446 + pull(
447 + sbot.links({rel: 'vote', dest: msg.key, live: true }),
448 + pull.drain(function (link) {
449 + if (link.key) {
450 + sbot.get(link.key, function (err, data) {
451 + if (err) throw err
452 + if (data.content.vote) {
453 + if (data.content.vote.value == 1) {
454 + if (localStorage[data.author + 'name'])
455 + name = localStorage[data.author + 'name']
456 + else
457 + name = data.author
458 + votes.appendChild(h('a#vote:' + data.author.substring(0, 44), {href:'#' + data.author, title: name}, h('img.emoji', {src: config.emojiUrl + 'star.png'})))
459 + }
460 + else if (data.content.vote.value == -1) {
461 + var lookFor = 'vote:' + data.author.substring(0, 44)
462 + document.getElementById(lookFor, function (err, gotit) {
463 + if (err) throw err
464 + gotit.parentNode.removeChild(remove)
465 + })
466 + }
467 + }
468 + })
469 + }
470 + })
471 + )
472 + }
473 + return votes
474 +}
475 +
476 +module.exports.timestamp = function (msg, edited) {
477 + var timestamp
478 + if (edited)
479 + timestamp = h('span.timestmap.right', 'Edited by: ', h('a', {href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))), h('a', {href: '#' + msg.key}, human(new Date(msg.value.timestamp))))
480 + else
481 + timestamp = h('span.timestamp.right', h('a', {href: '#' + msg.key}, human(new Date(msg.value.timestamp))))
482 + return timestamp
483 +}
484 +
485 +
486 +module.exports.mini = function (msg, content) {
487 + var mini = h('div.mini')
488 +
489 + mini.appendChild(
490 + h('span.avatar',
491 + h('a', {href: '#' + msg.value.author},
492 + h('span.avatar--small', avatar.cachedImage(msg.value.author)),
493 + avatar.cachedName(msg.value.author)
494 + )
495 + )
496 + )
497 + var lock = h('span.right', h('img.emoji', {src: config.emojiUrl + 'lock.png'}))
498 +
499 +
500 + mini.appendChild(h('span', content))
501 + mini.appendChild(exports.timestamp(msg))
502 +
503 + if (msg.value.content.recps) {
504 + mini.appendChild(lock)
505 + }
506 +
507 + if (typeof msg.value.content === 'string') {
508 + mini.appendChild(lock)
509 + }
510 +
511 + return mini
512 +}
513 +
514 +module.exports.header = function (msg) {
515 + var header = h('div.header')
516 +
517 + header.appendChild(h('span.avatar',
518 + h('a', {href: '#' + msg.value.author},
519 + h('span.avatar--small', avatar.cachedImage(msg.value.author)),
520 + avatar.cachedName(msg.value.author)
521 + )
522 + )
523 + )
524 +
525 + header.appendChild(exports.timestamp(msg))
526 + header.appendChild(votes(msg))
527 +
528 + if (msg.value.private) {
529 + header.appendChild(h('span.right', ' ', h('img.emoji', {src: config.emojiUrl + 'lock.png'})))
530 + }
531 + if (msg.value.content.type == 'edit') {
532 + header.appendChild(h('span.right', ' Edited: ', h('a', {href: '#' + msg.value.content.original}, exports.messageLink(msg.value.content.original))))
533 + }
534 + return header
535 +}
536 +
537 +
538 +
539 +
540 +module.exports.messageName = function (id, cb) {
541 + // gets the first few characters of a message, for message-link
542 + function title (s) {
543 + var m = /^\n*([^\n]{0,40})/.exec(s)
544 + return m && (m[1].length == 40 ? m[1]+'...' : m[1])
545 + }
546 +
547 + sbot.get(id, function (err, value) {
548 + if(err && err.name == 'NotFoundError')
549 + return cb(null, id.substring(0, 10)+'...(missing)')
550 + if(value.content.type === 'post' && 'string' === typeof value.content.text)
551 + return cb(null, title(value.content.text))
552 + else if('string' === typeof value.content.text)
553 + return cb(null, value.content.type + ':'+title(value.content.text))
554 + else
555 + return cb(null, id.substring(0, 10)+'...')
556 + })
557 +}
558 +
559 +var messageName = exports.messageName
560 +
561 +module.exports.messageLink = function (id) {
562 + if (ref.isMsg(id)) {
563 + var link = h('a', {href: '#'+id}, id.substring(0, 10)+'...')
564 + messageName(id, function (err, name) {
565 + if(err) console.error(err)
566 + else link.textContent = name
567 + })
568 + } else {
569 + var link = id
570 + }
571 + return link
572 +}
573 +
574 +module.exports.rawJSON = function (obj) {
575 + return JSON.stringify(obj, null, 2)
576 + .split(/([%@&][a-zA-Z0-9\/\+]{43}=*\.[\w]+)/)
577 + .map(function (e) {
578 + if(ref.isMsg(e) || ref.isFeed(e) || ref.isBlob(e)) {
579 + return h('a', {href: '#' + e}, e)
580 + }
581 + return e
582 + })
583 +}
584 +
585 +var markdown = require('ssb-markdown')
586 +var config = require('./config')()
587 +
588 +module.exports.markdown = function (msg, md) {
589 + return {innerHTML: markdown.block(msg, {toUrl: function (url, image) {
590 + if(url[0] == '%' || url[0] == '@' || url[0] == '#') return '#' + url
591 + if(url[0] !== '&') return url
592 + //if(url[0] == '&') return config.blobsUrl + url
593 + //if(!image) return url
594 + return config.blobsUrl + url
595 + }})}
596 +}
ui/views.jsView
@@ -1,0 +1,756 @@
1 +var pull = require('pull-stream')
2 +var human = require('human-time')
3 +var sbot = require('./scuttlebot')
4 +var hyperscroll = require('hyperscroll')
5 +var hyperfile = require('hyperfile')
6 +var dataurl = require('dataurl-')
7 +var More = require('pull-more')
8 +var stream = require('hyperloadmore/stream')
9 +var h = require('hyperscript')
10 +var render = require('./render')
11 +var ref = require('ssb-ref')
12 +var client = require('ssb-client')
13 +var Next = require('pull-next-query')
14 +var config = require('./config')()
15 +var tools = require('./tools')
16 +var avatar = require('./avatar')
17 +var id = require('./keys').id
18 +var ssbKeys = require('ssb-keys')
19 +var keys = require('./keys')
20 +var compose = require('./compose')
21 +
22 +
23 +var labelStream = function (label){
24 + var content = h('div.content')
25 + var screen = document.getElementById('screen')
26 + screen.appendChild(hyperscroll(content))
27 + content.appendChild(h('div.breadcrumbs.message', h('a', {href: '/'}, 'label'), ' ⯈ ' , h('a', {href: '/#label/' + label}, label)))
28 + function createStream (opts) {
29 + return pull(
30 + Next(sbot.query, opts, ['value', 'timestamp']),
31 + pull.map(function (msg){
32 + if (msg.value) {
33 + sbot.get(msg.value.content.link, function (err, data) {
34 + if (data) {
35 + var message = {}
36 + message.value = data
37 + message.key = msg.value.content.link
38 + content.appendChild(render(message))
39 + }
40 + })
41 + }
42 + })
43 + )
44 + }
45 +
46 + pull(
47 + createStream({
48 + limit: 10,
49 + reverse: true,
50 + live: false,
51 + query: [{$filter: { value: { content: {type: 'label', label: label }, timestamp: { $gt: 0 }}}}]
52 + }),
53 + stream.bottom(content)
54 + )
55 +
56 + pull(
57 + createStream({
58 + limit: 10,
59 + old: false,
60 + live: true,
61 + query: [{$filter: { value: { content: {type: 'label', label: label }, timestamp: { $gt: 0 }}}}]
62 + }),
63 + stream.top(content)
64 + )
65 +}
66 +
67 +
68 +var privateStream = function () {
69 + var screen = document.getElementById('screen')
70 + var content = h('div.content')
71 +
72 + screen.appendChild(hyperscroll(content))
73 +
74 + function createStream (opts) {
75 + return pull(
76 + Next(sbot.query, opts, ['value', 'timestamp']),
77 + pull.filter(function (msg) {
78 + return ((msg.value.private == true) || ('string' == typeof msg.value.content))
79 + }),
80 + pull.map(function (msg) {
81 + /*if (msg.value.private != true) {
82 + var unboxed = ssbKeys.unbox(msg.value.content, keys)
83 + if (unboxed) {
84 + msg.value.content = unboxed
85 + msg.value.private = true
86 + return render(msg)
87 + } else {
88 + return render(msg)
89 + }
90 + } else {return render(msg)}*/
91 + return render(msg)
92 + })
93 + )
94 + }
95 +
96 + pull(
97 + createStream({
98 + limit: 100,
99 + reverse: true,
100 + live: false,
101 + query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
102 + }),
103 + stream.bottom(content)
104 + )
105 +
106 + pull(
107 + createStream({
108 + limit: 100,
109 + old: false,
110 + live: true,
111 + query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
112 + }),
113 + stream.top(content)
114 + )
115 +
116 +
117 + /*function createStream (opts) {
118 + return pull(
119 + Next(sbot.query, opts, ['value', 'timestamp']),
120 + pull.map(function (msg) {
121 + if (msg.value) {
122 + if (msg.value.timestamp > Date.now()) {
123 + return h('div.future')
124 + } else {
125 + return render(msg)
126 + }
127 + }
128 + })
129 + )
130 + }
131 +
132 + pull(
133 + createStream({
134 + limit: 10,
135 + reverse: true,
136 + live: false,
137 + query: [{$filter: { value: { private: true, timestamp: { $gt: 0 }}}}]
138 + }),
139 + stream.bottom(content)
140 + )
141 +
142 + pull(
143 + createStream({
144 + limit: 10,
145 + old: false,
146 + live: true,
147 + query: [{$filter: { value: { private: true, timestamp: { $gt: 0 }}}}]
148 + }),
149 + stream.top(content)
150 + )*/
151 +
152 +
153 + /*function createStream (opts) {
154 + return pull(
155 + More(sbot.createLogStream, opts),
156 + pull.filter(function (msg) {
157 + return 'string' == typeof msg.value.content
158 + }),
159 + pull.filter(function (msg) {
160 + var unboxed = ssbKeys.unbox(msg.value.content, keys)
161 + if (unboxed) {
162 + msg.value.content = unboxed
163 + msg.value.private = true
164 + return msg
165 + } else {
166 + return msg
167 + }
168 + }),
169 + pull.map(function (msg) {
170 + return render(msg)
171 + })
172 + )
173 + }
174 +
175 + pull(
176 + createStream({old: false, limit: 1000}),
177 + stream.top(content)
178 + )
179 +
180 + pull(
181 + createStream({reverse: true, live: false, limit: 1000}),
182 + stream.bottom(content)
183 + )*/
184 +}
185 +
186 +var queueStream = function () {
187 + var content = h('div.content')
188 + var screen = document.getElementById('screen')
189 + screen.appendChild(hyperscroll(content))
190 +
191 + pull(
192 + sbot.query({query: [{$filter: { value: {author: id, content: {type: 'queue'}}}}]}),
193 + pull.drain(function (msg) {
194 + if (msg.value) {
195 + if (ref.isMsg(msg.value.content.message)) {
196 + if (msg.value.content.queue == true) {
197 + sbot.get(msg.value.content.message, function (err, data) {
198 + if (data) {
199 + var message = {}
200 + message.value = data
201 + message.key = msg.value.content.message
202 + content.appendChild(render(message))
203 + }
204 + })
205 + }
206 + if (msg.value.content.queue == false) {
207 + setTimeout(function () {
208 + var gotIt = document.getElementById(msg.value.content.message.substring(0,44))
209 + if (gotIt != null) {
210 + gotIt.outerHTML = ''
211 + }
212 + }, 100)
213 + }
214 + }
215 + }
216 + })
217 + )
218 +}
219 +
220 +var mentionsStream = function (src) {
221 + var content = h('div.content')
222 +
223 + var screen = document.getElementById('screen')
224 +
225 + screen.appendChild(hyperscroll(content))
226 +
227 + function createStream (opts) {
228 + return pull(
229 + Next(sbot.backlinks, opts, ['value', 'timestamp']),
230 + pull.map(function (msg) {
231 + if (msg.value.private == true) return h('div.private')
232 + return render(msg)
233 + })
234 + )
235 + }
236 +
237 + pull(
238 + createStream({
239 + limit: 10,
240 + reverse: true,
241 + index: 'DTA',
242 + live: false,
243 + query: [{$filter: {dest: src}}]
244 + }),
245 + stream.bottom(content)
246 + )
247 +
248 + pull(
249 + createStream({
250 + limit: 10,
251 + old: false,
252 + index: 'DTA',
253 + live: true,
254 + query: [{$filter: {dest: src}}]
255 + }),
256 + stream.top(content)
257 + )
258 +}
259 +
260 +var userStream = function (src) {
261 + var content = h('div.content')
262 + var screen = document.getElementById('screen')
263 +
264 + screen.appendChild(hyperscroll(content))
265 +
266 + function createStream (opts) {
267 + return pull(
268 + More(sbot.userStream, opts, ['value', 'sequence']),
269 + pull.map(function (msg) {
270 + return render(h('div', msg))
271 + })
272 + )
273 + }
274 +
275 + pull(
276 + createStream({old: false, limit: 10, id: src}),
277 + stream.top(content)
278 + )
279 +
280 + pull(
281 + createStream({reverse: true, live: false, limit: 10, id: src}),
282 + stream.bottom(content)
283 + )
284 +
285 + var profile = h('div.content#profile', h('div.message'))
286 +
287 + if (screen.firstChild.firstChild) {
288 + screen.firstChild.insertBefore(profile, screen.firstChild.firstChild)
289 + } else {
290 + screen.firstChild.appendChild(profile)
291 + }
292 +
293 + var name = avatar.name(src)
294 +
295 + var editname = h('span',
296 + avatar.name(src),
297 + h('button.btn', 'New name', {
298 + onclick: function () {
299 + var nameput = h('input', {placeholder: name.textContent})
300 + var nameedit =
301 + h('span', nameput,
302 + h('button.btn', 'Preview', {
303 + onclick: function () {
304 + if (nameput.value[0] != '@')
305 + tobename = nameput.value
306 + else
307 + tobename = nameput.value.substring(1, 100)
308 + var newname = h('span', h('a', {href: '#' + src}, '@' + tobename), h('button.btn', 'Publish', {
309 + onclick: function () {
310 + var donename = h('span', h('a', {href: '#' + src}, '@' + tobename))
311 + sbot.publish({type: 'about', about: src, name: tobename})
312 + localStorage[src + 'name'] = tobename
313 + newname.parentNode.replaceChild(donename, newname)
314 + }
315 + }))
316 + nameedit.parentNode.replaceChild(newname, nameedit)
317 + }
318 + })
319 + )
320 + editname.parentNode.replaceChild(nameedit, editname)
321 + }
322 + })
323 + )
324 +
325 + var editimage = h('span',
326 + h('button.btn', 'New image', {
327 + onclick: function () {
328 + var upload =
329 + h('span',
330 + hyperfile.asDataURL(function (data) {
331 + if(data) {
332 + //img.src = data
333 + var _data = dataurl.parse(data)
334 + pull(
335 + pull.once(_data.data),
336 + sbot.addblob(function (err, hash) {
337 + if(err) return alert(err.stack)
338 + selected = {
339 + link: hash,
340 + size: _data.data.length,
341 + type: _data.mimetype
342 + }
343 + })
344 + )
345 + }
346 + }),
347 + h('button.btn', 'Preview image', {
348 + onclick: function() {
349 + if (selected) {
350 + console.log(selected)
351 + var oldImage = document.getElementById('profileImage')
352 + var newImage = h('span.avatar--medium', h('img', {src: config.blobsUrl + selected.link}))
353 + var publish = h('button.btn', 'Publish image', {
354 + onclick: function () {
355 + sbot.publish({
356 + type: 'about',
357 + about: src,
358 + image: selected
359 + }, function (err, published) {
360 + console.log(published)
361 + })
362 + }
363 + })
364 + upload.parentNode.replaceChild(publish, upload)
365 + oldImage.parentNode.replaceChild(newImage, oldImage)
366 + }
367 + /*if(selected) {
368 + api.message_confirm({
369 + type: 'about',
370 + about: id,
371 + image: selected
372 + })
373 + } else { alert('select an image before hitting preview')}*/
374 + }
375 + })
376 + )
377 + editimage.parentNode.replaceChild(upload, editimage)
378 + }
379 + })
380 + )
381 +
382 + var avatars = h('div.avatars',
383 + h('a', {href: '#' + src},
384 + h('span.avatar--medium#profileImage', avatar.image(src)),
385 + editname,
386 + h('br'),
387 + editimage
388 + )
389 + )
390 +
391 + pull(
392 + sbot.userStream({id: src, reverse: false, limit: 1}),
393 + pull.drain(function (msg) {
394 + var howlong = h('span', h('br'), ' arrived ', human(new Date(msg.value.timestamp)))
395 + avatars.appendChild(howlong)
396 + console.log(msg)
397 + })
398 + )
399 +
400 +
401 + var buttons = h('div.buttons')
402 +
403 + profile.firstChild.appendChild(avatars)
404 + profile.firstChild.appendChild(buttons)
405 + buttons.appendChild(tools.mute(src))
406 +
407 + var writeMessage = h('button.btn', 'Public message ', avatar.name(src), {
408 + onclick: function () {
409 + opts = {}
410 + opts.type = 'post'
411 + opts.mentions = '[' + name.textContent + '](' + src + ')'
412 + var composer = h('div#composer', h('div.message', compose(opts)))
413 + profile.appendChild(composer)
414 + }
415 + })
416 +
417 + var writePrivate = h('button.btn', 'Private message ', avatar.name(src), {
418 + onclick: function () {
419 + opts = {}
420 + opts.type = 'post'
421 + opts.mentions = '[' + name.textContent + '](' + src + ')'
422 + opts.recps = [src, id]
423 + var composer = h('div#composer', h('div.message', compose(opts)))
424 + profile.appendChild(composer)
425 + }
426 + })
427 +
428 + buttons.appendChild(writeMessage)
429 + buttons.appendChild(writePrivate)
430 + buttons.appendChild(tools.follow(src))
431 + buttons.appendChild(tools.block(src))
432 +
433 + buttons.appendChild(h('button.btn', 'Generate follows', {
434 + onclick: function () {
435 + profile.firstChild.appendChild(tools.getFollowing(src))
436 + profile.firstChild.appendChild(tools.getFollowers(src))
437 + }
438 + }))
439 +
440 + buttons.appendChild(h('button.btn', 'Generate blocks', {
441 + onclick: function () {
442 + profile.firstChild.appendChild(tools.getBlocks(src))
443 + profile.firstChild.appendChild(tools.getBlocked(src))
444 + }
445 + }))
446 + buttons.appendChild(h('a', {href: '#wall/' + src}, h('button.btn', avatar.name(src), "'s wall")))
447 +
448 +}
449 +
450 +var privateMsg = function (src) {
451 + var content = h('div.content')
452 + var screen = document.getElementById('screen')
453 + screen.appendChild(hyperscroll(content))
454 +
455 + sbot.get(src, function (err, data) {
456 + if (err) {
457 + var message = h('div.message', 'Missing message!')
458 + content.appendChild(message)
459 + }
460 + if (data) {
461 + console.log(data)
462 + data.value = data
463 + data.key = src
464 +
465 + content.appendChild(render(data))
466 + }
467 +
468 + })
469 +}
470 +
471 +var msgThread = function (src) {
472 +
473 + var content = h('div.content')
474 + var screen = document.getElementById('screen')
475 + screen.appendChild(hyperscroll(content))
476 +
477 + pull(
478 + sbot.query({query: [{$filter: { value: { content: {root: src}, timestamp: { $gt: 1 }}}}], live: true}),
479 + pull.drain(function (msg) {
480 + if (msg.value) {
481 + content.appendChild(render(msg))
482 + }
483 + })
484 + )
485 +
486 + sbot.get(src, function (err, data) {
487 + if (err) {
488 + var message = h('div.message', 'Missing message!')
489 + content.appendChild(message)
490 + }
491 + if (data) {
492 + var message = {}
493 + message.value = data
494 + message.key = src
495 + console.log(message)
496 + var rootMsg = render(message)
497 +
498 + if (content.firstChild) {
499 + content.insertBefore(rootMsg, content.firstChild)
500 + } else {
501 + content.appendChild(rootMsg)
502 + }
503 + if (message.value.content.type == 'git-repo') {
504 + pull(
505 + sbot.backlinks({query: [{$filter: {value: {content: {type: 'git-update'}}, dest: src}}]}),
506 + pull.drain(function (msg) {
507 + if (msg.value) {
508 + content.appendChild(render(msg))
509 + }
510 + })
511 + )
512 + }
513 +
514 + }
515 + })
516 +
517 +}
518 +
519 +var keyPage = function () {
520 + var screen = document.getElementById('screen')
521 +
522 + var importKey = h('textarea.import', {placeholder: 'Import a new public/private key', name: 'textarea', style: 'width: 97%; height: 100px;'})
523 +
524 + var content = h('div.content',
525 + h('div.message#key',
526 + h('h1', 'Your Key'),
527 + h('p', {innerHTML: 'Your public/private key is: <pre><code>' + localStorage[config.caps.shs + '/secret'] + '</code></pre>'},
528 + h('button.btn', {onclick: function (e){
529 + localStorage[config.caps.shs +'/secret'] = ''
530 + alert('Your public/private key has been deleted')
531 + e.preventDefault()
532 + location.hash = ""
533 + location.reload()
534 + }}, 'Delete Key')
535 + ),
536 + h('hr'),
537 + h('form',
538 + importKey,
539 + h('button.btn', {onclick: function (e){
540 + if(importKey.value) {
541 + localStorage[config.caps.shs + '/secret'] = importKey.value.replace(/\s+/g, ' ')
542 + e.preventDefault()
543 + alert('Your public/private key has been updated')
544 + }
545 + location.hash = ""
546 + location.reload()
547 + }}, 'Import key'),
548 + )
549 + )
550 + )
551 +
552 + screen.appendChild(hyperscroll(content))
553 +}
554 +
555 +
556 +function friendsStream (src) {
557 +
558 + var screen = document.getElementById('screen')
559 + var content = h('div.content')
560 +
561 + screen.appendChild(hyperscroll(content))
562 +
563 + function createStream (opts) {
564 + return pull(
565 + Next(sbot.query, opts, ['value', 'timestamp']),
566 + pull.map(function (msg) {
567 + sbot.friends.get({source: src, dest: msg.value.author}, function (err, data) {
568 + if (data === true) {
569 + return content.appendChild(render(msg))
570 + console.log(msg)
571 + } else {
572 + return content.appendChild(h('div'))
573 + }
574 + })
575 + })
576 + )
577 + }
578 +
579 + pull(
580 + createStream({
581 + limit: 1000,
582 + reverse: true,
583 + live: false,
584 + query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
585 + }),
586 + stream.bottom(content)
587 + )
588 +
589 +}
590 +
591 +function everythingStream () {
592 +
593 + var screen = document.getElementById('screen')
594 + var content = h('div.content')
595 +
596 + screen.appendChild(hyperscroll(content))
597 +
598 + function createStream (opts) {
599 + return pull(
600 + Next(sbot.query, opts, ['value', 'timestamp']),
601 + pull.map(function (msg) {
602 + if (msg.value) {
603 + if (msg.value.timestamp > Date.now()) {
604 + return h('div.future')
605 + } else {
606 + return render(msg)
607 + }
608 + }
609 + })
610 + )
611 + }
612 +
613 + pull(
614 + createStream({
615 + limit: 10,
616 + reverse: true,
617 + live: false,
618 + query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
619 + }),
620 + stream.bottom(content)
621 + )
622 +
623 + pull(
624 + createStream({
625 + limit: 10,
626 + old: false,
627 + live: true,
628 + query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
629 + }),
630 + stream.top(content)
631 + )
632 +}
633 +
634 +
635 +
636 +
637 +function backchannel () {
638 +
639 + var screen = document.getElementById('screen')
640 + var content = h('div.content')
641 +
642 + screen.appendChild(hyperscroll(content))
643 +
644 + var chatbox = h('input', {placeholder: 'Backchannel'})
645 +
646 + var chat = h('div.content')
647 +
648 + var publish = h('button.btn', 'Publish', {
649 + onclick: function () {
650 + if (chatbox.value) {
651 + var content = {
652 + text: chatbox.value,
653 + type: 'scat_message'
654 + }
655 + sbot.publish(content, function (err, msg) {
656 + if (err) throw err
657 + chatbox.value = ''
658 + console.log('Published!', msg)
659 + })
660 + }
661 + }
662 + })
663 +
664 + chat.appendChild(h('div.message', chatbox, publish))
665 +
666 + if (screen.firstChild.firstChild) {
667 + screen.firstChild.insertBefore(chat, screen.firstChild.firstChild)
668 + } else {
669 + screen.firstChild.appendChild(chat)
670 + }
671 +
672 + function createStream (opts) {
673 + return pull(
674 + Next(sbot.query, opts, ['value', 'timestamp']),
675 + pull.map(function (msg) {
676 + if (msg.value) {
677 + return render(msg)
678 + }
679 + })
680 + )
681 + }
682 +
683 + pull(
684 + createStream({
685 + limit: 10,
686 + reverse: true,
687 + live: false,
688 + query: [{$filter: { value: { content: {type: 'scat_message'}, timestamp: { $gt: 0 }}}}]
689 + }),
690 + stream.bottom(content)
691 + )
692 +
693 + pull(
694 + createStream({
695 + limit: 10,
696 + old: false,
697 + live: true,
698 + query: [{$filter: { value: { content: {type: 'scat_message'}, timestamp: { $gt: 0 }}}}]
699 + }),
700 + stream.top(content)
701 + )
702 +}
703 +
704 +function search (src) {
705 + console.log('search' + src)
706 +
707 + var content = h('div.content')
708 + var screen = document.getElementById('screen')
709 + screen.appendChild(hyperscroll(content))
710 +
711 + pull(
712 + sbot.search.query({query: src, limit: 100}),
713 + pull.drain(function (search) {
714 + content.appendChild(render(search))
715 + })
716 + )
717 +
718 +}
719 +
720 +function hash () {
721 + return window.location.hash.substring(1)
722 +}
723 +
724 +module.exports = function () {
725 + var src = hash()
726 +
727 + if (src.substring(52, 59) == '?unbox=') {
728 + privateMsg(src)
729 + } else if (ref.isFeed(src)) {
730 + userStream(src)
731 + } else if (ref.isMsg(src)) {
732 + msgThread(src)
733 + } else if (ref.isFeed(src.substring(5))) {
734 + mentionsStream(src.substring(5))
735 + } else if (ref.isFeed(src.substring(8))) {
736 + friendsStream(src.substring(8))
737 + } else if (src.substring(0, 6) === 'label/') {
738 + labelStream(src.substring(6))
739 + } else if (src == 'queue') {
740 + queueStream()
741 + } else if (src == 'backchannel') {
742 + backchannel()
743 + } else if (src == 'private') {
744 + privateStream()
745 + } else if (src == 'key') {
746 + keyPage()
747 + } else if (src[0] == '?' || (src[0] == '#')) {
748 + if (src[0] == '#')
749 + search(src.split('%20').join(' '))
750 + else
751 + search(src.substr(1).split('%20').join(' '))
752 + } else {
753 + everythingStream()
754 + }
755 +
756 +}
render.jsView
@@ -1,430 +1,0 @@
1-var h = require('hyperscript')
2-var pull = require('pull-stream')
3-var human = require('human-time')
4-
5-var sbot = require('./scuttlebot')
6-var composer = require('./compose')
7-var tools = require('./tools')
8-
9-var config = require('./config')()
10-var id = require('./keys').id
11-var avatar = require('./avatar')
12-var ssbAvatar = require('ssb-avatar')
13-
14-var ssbKeys = require('ssb-keys')
15-var keys = require('./keys')
16-
17-var diff = require('diff')
18-
19-function hash () {
20- return window.location.hash.substring(1)
21-}
22-
23-module.exports = function (msg) {
24- var message = h('div.message#' + msg.key.substring(0, 44))
25-
26- if (!localStorage[msg.value.author])
27- var cache = {mute: false}
28- else
29- var cache = JSON.parse(localStorage[msg.value.author])
30-
31- if (cache.mute == true) {
32- var muted = h('span', ' muted')
33- message.appendChild(tools.mini(msg, muted))
34- return message
35- }
36-
37- else if (msg.value.content.type == 'about') {
38- if (msg.value.content.image) {
39- var image = h('span.avatar--small',
40- ' identified ',
41- h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
42- ' as ',
43- h('img', {src: config.blobsUrl + msg.value.content.image.link})
44- )
45- message.appendChild(tools.mini(msg, image))
46- }
47- if (msg.value.content.name) {
48- var name = h('span',
49- ' identified ',
50- h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
51- ' as ', msg.value.content.name
52- )
53- message.appendChild(tools.mini(msg, name))
54- }
55-
56- return message
57- }
58-
59- else if (msg.value.content.type == 'label'){
60- var content = h('span', ' labeled ', tools.messageLink(msg.value.content.link), ' as ', h('mark', h('a', {href: '#label/' + msg.value.content.label}, msg.value.content.label)))
61- message.appendChild(tools.mini(msg, content))
62- return message
63- }
64-
65- else if (msg.value.content.type == 'queue') {
66- if (msg.value.content.queue == true) {
67- var content = h('span', ' added ', tools.messageLink(msg.value.content.message), ' to their ', h('a', {href: '#queue'}, 'queue'))
68- message.appendChild(tools.mini(msg, content))
69- }
70- if (msg.value.content.queue == false) {
71- var content = h('span', ' removed ', tools.messageLink(msg.value.content.message), ' from their ', h('a', {href: '#queue'}, 'queue'))
72- message.appendChild(tools.mini(msg, content))
73-
74- }
75- return message
76- }
77-
78- else if (msg.value.content.type == 'edit') {
79- message.appendChild(tools.header(msg))
80- if (msg.value.content.text) {
81- var current = msg.value.content.text
82- sbot.get(msg.value.content.updated, function (err, updated) {
83- if (updated) {
84- // quick fix, need to decrypt messages if they're private
85- if (updated.content.text) {
86- fragment = document.createDocumentFragment()
87- var previous = updated.content.text
88- var ready = diff.diffWords(previous, current)
89- ready.forEach(function (part) {
90- if (part.added === true) {
91- color = 'cyan'
92- } else if (part.removed === true) {
93- color = 'gray'
94- } else {color = '#333'}
95- var span = h('span')
96- span.style.color = color
97- if (part.removed === true) {
98- span.appendChild(h('del', document.createTextNode(part.value)))
99- } else {
100- span.appendChild(document.createTextNode(part.value))
101- }
102- fragment.appendChild(span)
103- })
104- message.appendChild(h('code', fragment))
105- }
106- }
107- })
108- }
109- return message
110- }
111-
112- else if (msg.value.content.type == 'scat_message') {
113- var src = hash()
114- if (src != 'backchannel') {
115- message.appendChild(h('button.btn.right', h('a', {href: '#backchannel'}, 'Chat')))
116- }
117- message.appendChild(tools.mini(msg, ' ' + msg.value.content.text))
118- return message
119- }
120- else if (msg.value.content.type == 'contact') {
121- if (msg.value.content.contact) {
122- var contact = h('a', {href: '#' + msg.value.content.contact}, avatar.name(msg.value.content.contact))
123- } else { var contact = h('p', 'no contact named')}
124-
125- if (msg.value.content.following == true) {
126- var following = h('span', ' follows ', contact)
127- message.appendChild(tools.mini(msg, following))
128- }
129- if (msg.value.content.following == false) {
130- var unfollowing = h('span', ' unfollows ', contact)
131- message.appendChild(tools.mini(msg, unfollowing))
132- }
133- if (msg.value.content.blocking == true) {
134- var blocking = h('span', ' blocks ', contact)
135- message.appendChild(tools.mini(msg, blocking))
136- }
137- if (msg.value.content.blocking == false) {
138- var unblocking = h('span', ' unblocks ', contact)
139- message.appendChild(tools.mini(msg, unblocking))
140- }
141- return message
142-
143- }
144-
145- else if (msg.value.content.type == 'git-update') {
146-
147- message.appendChild(tools.header(msg))
148-
149- var reponame = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, msg.value.content.repo))
150-
151- var cloneurl = h('pre', 'git clone ssb://' + msg.value.content.repo)
152-
153- message.appendChild(reponame)
154-
155-
156- ssbAvatar(sbot, id, msg.value.content.repo, function (err, data) {
157- if (data) {
158- var actualname = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, '%' + data.name))
159- reponame.parentNode.replaceChild(actualname, reponame)
160- }
161- })
162-
163- message.appendChild(cloneurl)
164-
165- var commits = h('ul')
166- //if (msg.value.content.commits[0]) {
167- if (msg.value.content.commits) {
168- msg.value.content.commits.map(function (commit) {
169- commits.appendChild(h('li', h('code', commit.sha1), ' - ', commit.title))
170- })
171-
172- }
173-
174- message.appendChild(commits)
175-
176- return message
177-
178- }
179- else if (msg.value.content.type == 'git-repo') {
180- message.appendChild(tools.header(msg))
181-
182- var reponame = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, msg.key))
183-
184- message.appendChild(reponame)
185-
186- ssbAvatar(sbot, id, msg.key, function (err, data) {
187- if (data)
188- var actualname = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, '%' + data.name))
189- reponame.parentNode.replaceChild(actualname, reponame)
190- })
191-
192- var cloneurl = h('pre', 'git clone ssb://' + msg.key)
193- message.appendChild(cloneurl)
194- return message
195- }
196-
197- else if (msg.value.content.type == 'wiki') {
198- var fallback = {}
199-
200- var opts = {
201- type: 'wiki',
202- branch: msg.key
203- }
204-
205- if (msg.value.content.root)
206- opts.root = msg.value.content.root
207- else
208- opts.root = msg.key
209-
210- message.appendChild(tools.header(msg))
211-
212- message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
213-
214- pull(
215- sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
216- pull.drain(function (update) {
217- if (update.sync) {
218- } else {
219- var newMessage = h('div', tools.markdown(update.value.content.text))
220- var latest = h('div.message__body',
221- tools.timestamp(update, {edited: true}),
222- newMessage
223- )
224- message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
225- fallback.messageText = update.value.content.text
226- opts.updated = update.key
227- opts.original = msg.key
228- }
229- })
230- )
231-
232- var buttons = h('div.buttons')
233-
234- buttons.appendChild(h('button.btn', 'Edit wiki', {
235- onclick: function () {
236- opts.type = 'edit'
237- if (!fallback.messageText)
238- fallback.messageText = msg.value.content.text
239-
240- if (!opts.updated)
241- opts.updated = msg.key
242- opts.original = msg.key
243-
244- var r = message.childNodes.length - 1
245- fallback.buttons = message.childNodes[r]
246- message.removeChild(message.childNodes[r])
247- var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
248- message.replaceChild(compose, message.lastElementChild)
249- }
250- }))
251-
252- buttons.appendChild(tools.star(msg))
253- message.appendChild(buttons)
254- return message
255-
256- } else if (msg.value.content.type == 'post') {
257- var opts = {
258- type: 'post',
259- branch: msg.key
260- }
261- var fallback = {}
262-
263-
264- if (msg.value.content.root)
265- opts.root = msg.value.content.root
266- else
267- opts.root = msg.key
268-
269- message.appendChild(tools.header(msg))
270-
271- if (msg.value.content.root)
272- message.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root)))
273-
274- message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
275-
276- pull(
277- sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
278- pull.drain(function (update) {
279- if (update.sync) {
280- } else {
281- var newMessage = h('div', tools.markdown(update.value.content.text))
282- var latest = h('div.message__body',
283- tools.timestamp(update, {edited: true}),
284- newMessage
285- )
286- message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
287- fallback.messageText = update.value.content.text
288- opts.updated = update.key
289- opts.original = msg.key
290- }
291- })
292- )
293-
294- pull(
295- sbot.query({query: [{$filter: {value: { content: {type: 'label', link: msg.key}}}}], limit: 100, live: true}),
296- pull.drain(function (labels){
297- console.log(labels)
298- if (labels.value){
299- message.appendChild(h('span', ' ', h('mark', h('a', {href: '#label/' + labels.value.content.label}, labels.value.content.label))))
300-
301- }
302- })
303- )
304-
305- var name = avatar.name(msg.value.author)
306-
307- var buttons = h('div.buttons')
308-
309- buttons.appendChild(h('button.btn', 'Reply', {
310- onclick: function () {
311- opts.type = 'post'
312- opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
313- if (msg.value.content.recps) {
314- opts.recps = msg.value.content.recps
315- }
316- var r = message.childNodes.length - 1
317- delete opts.updated
318- delete opts.original
319- delete fallback.messageText
320- fallback.buttons = message.childNodes[r]
321- var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
322- message.removeChild(message.childNodes[r])
323- message.parentNode.insertBefore(compose, message.nextSibling)
324- }
325- }))
326-
327- buttons.appendChild(h('button.btn', 'Boost', {
328- onclick: function () {
329- opts.type = 'post'
330- opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
331- if (msg.value.content.recps) {
332- opts.recps = msg.value.content.recps
333- }
334- var r = message.childNodes.length - 1
335- delete opts.updated
336- delete opts.original
337- delete fallback.messageText
338- opts.boostContent = msg.value.content.text
339- opts.boostKey = msg.key
340- opts.boostAuthor = msg.value.author
341- fallback.buttons = message.childNodes[r]
342- var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
343- message.removeChild(message.childNodes[r])
344- message.parentNode.insertBefore(compose, message.nextSibling)
345- }
346- }))
347-
348-
349- if (msg.value.author == id)
350- buttons.appendChild(h('button.btn', 'Edit', {
351- onclick: function () {
352- opts.type = 'edit'
353- if (!fallback.messageText)
354- fallback.messageText = msg.value.content.text
355-
356- if (!opts.updated)
357- opts.updated = msg.key
358- opts.original = msg.key
359-
360- var r = message.childNodes.length - 1
361- fallback.buttons = message.childNodes[r]
362- message.removeChild(message.childNodes[r])
363- var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
364- message.replaceChild(compose, message.lastElementChild)
365- }
366- }))
367-
368-
369- var inputter = h('input', {placeholder: 'Add a label to this post ie art, books, new'})
370-
371- var labeler = h('div',
372- inputter,
373- h('button.btn', 'Publish label', {
374- onclick: function () {
375- var post = {}
376- post.type = 'label',
377- post.label = inputter.value,
378- post.link = msg.key
379-
380- sbot.publish(post, function (err, msg){
381- console.log(msg)
382- labeler.parentNode.replaceChild(buttons, labeler)
383- })
384- }
385- })
386- )
387-
388- var labels = h('button.btn', 'Add label', {
389- onclick: function () {
390- buttons.parentNode.replaceChild(labeler, buttons)
391- }
392- })
393-
394- buttons.appendChild(labels)
395- buttons.appendChild(tools.queueButton(msg))
396- buttons.appendChild(tools.star(msg))
397- message.appendChild(buttons)
398- return message
399-
400- } else if (msg.value.content.type == 'vote') {
401- if (msg.value.content.vote.value == 1)
402- var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'star.png'}), ' ', h('a', {href: '#' + msg.value.content.vote.link}, tools.messageLink(msg.value.content.vote.link)))
403- else if (msg.value.content.vote.value == -1)
404- var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'stars.png'}), ' ', h('a', {href: '#' + msg.value.content.vote.link}, tools.messageLink(msg.value.content.vote.link)))
405- message.appendChild(tools.mini(msg, link))
406- return message
407- } else if (typeof msg.value.content === 'string') {
408- var unboxed = ssbKeys.unbox(msg.value.content, keys)
409- if (unboxed) {
410- msg.value.content = unboxed
411- msg.value.private = true
412- return module.exports(msg)
413- } else {
414- var privateMsg = h('span', ' sent a private message.')
415- message.appendChild(tools.mini(msg, privateMsg))
416- return message
417- //return h('div')
418- }
419- } else {
420-
421- //FULL FALLBACK
422- message.appendChild(tools.header(msg))
423- message.appendChild(h('pre', tools.rawJSON(msg.value)))
424-
425- //MINI FALLBACK
426- //var fallback = h('span', ' ' + msg.value.content.type)
427- //message.appendChild(tools.mini(msg, fallback))
428- return h('div', message)
429- }
430-}
scuttlebot.jsView
@@ -1,120 +1,0 @@
1-var pull = require('pull-stream')
2-var ssbKeys = require('ssb-keys')
3-var ref = require('ssb-ref')
4-var reconnect = require('pull-reconnect')
5-
6-var config = require('./config')()
7-var createClient = require('ssb-client')
8-var createFeed = require('ssb-feed')
9-
10-var keys = require('./keys')
11-
12-var CACHE = {}
13-
14-var rec = reconnect(function (isConn) {
15- function notify (value) {
16- isConn(value)
17- }
18-
19- createClient(keys, {
20- manifest: require('./manifest.json'),
21- remote: config.remote,
22- caps: config.caps
23- }, function (err, _sbot) {
24- if(err)
25- return notify(err)
26-
27- sbot = _sbot
28- sbot.on('closed', function () {
29- sbot = null
30- notify(new Error('closed'))
31- })
32-
33- notify()
34- })
35-})
36-
37-var internal = {
38- getLatest: rec.async(function (id, cb) {
39- sbot.getLatest(id, cb)
40- }),
41- add: rec.async(function (msg, cb) {
42- sbot.add(msg, cb)
43- })
44-}
45-
46-var feed = createFeed(internal, keys, {remote: true})
47-
48-module.exports = {
49- acceptInvite: rec.async(function (invite, cb) {
50- sbot.invite.accept(invite, cb)
51- }),
52- createLogStream: rec.source(function (opts) {
53- return pull(
54- sbot.createLogStream(opts),
55- pull.through(function (e) {
56- CACHE[e.key] = CACHE[e.key] || e.value
57- })
58- )
59- }),
60- userStream: rec.source(function (config) {
61- return pull(
62- sbot.createUserStream(config),
63- pull.through(function (e) {
64- CACHE[e.key] = CACHE[e.key] || e.value
65- })
66- )
67- }),
68- backlinks: rec.source(function (query) {
69- return sbot.backlinks.read(query)
70- }),
71- query: rec.source(function (query) {
72- return sbot.query.read(query)
73- }),
74- get: rec.async(function (key, cb) {
75- //if('function' !== typeof cb)
76- //throw new Error('cb must be function')
77- if(CACHE[key]) cb(null, CACHE[key])
78- else sbot.get(key, function (err, value) {
79- if(err) return cb(err)
80- cb(null, CACHE[key] = value)
81- })
82- }),
83- links: rec.source(function (query) {
84- return sbot.links(query)
85- }),
86- addblob: rec.sink(function (cb) {
87- return sbot.blobs.add(cb)
88- }),
89- friends: {
90- get: rec.async(function (opts, cb) {
91- sbot.friends.get(opts, cb)
92- })
93- },
94- search: {
95- query: rec.source(function (opts) {
96- return sbot.search.query(opts)
97- })
98- },
99- publish: rec.async(function (content, cb) {
100- if(content.recps)
101- content = ssbKeys.box(content, content.recps.map(function (e) {
102- return ref.isFeed(e) ? e : e.link
103- }))
104- else if(content.mentions)
105- content.mentions.forEach(function (mention) {
106- if(ref.isBlob(mention.link)) {
107- sbot.blobs.push(mention.link, function (err) {
108- if(err) console.error(err)
109- })
110- }
111- })
112- feed.add(content, function (err, msg) {
113- if(err) console.error(err)
114- else if(!cb) console.log(msg)
115- cb && cb(err, msg)
116- })
117- })
118-
119-}
120-
style.cssView
@@ -1,302 +1,0 @@
1-body {
2- margin: 0;
3- background: black;
4- font-family: sans-serif;
5- color: #f5f5f5;
6- font-size: 14px;
7- line-height: 20px;
8-}
9-
10-#screen {
11- position: absolute;
12- top: 35px;
13- bottom: 0px;
14- left: 0px;
15- right: 0px;
16-}
17-
18-.hyperscroll {
19- width: 100%;
20-}
21-
22-.search {
23- margin-top: 1.5px;
24- float: right;
25- width: 200px;
26-}
27-
28-.header {
29- padding-bottom: .7em;
30- border-bottom: 1px solid #252525;
31-}
32-
33-mark p, mark a {
34- color: black;
35-}
36-
37-h1, h2, h3, h4, h5, h6 {
38- font-size: 1.2em;
39- margin-top: .35ex;
40-}
41-
42-hr {
43- border: solid #222;
44- clear: both;
45- border-width: 1px 0 0;
46- height: 0;
47- margin-bottom: .9em;
48-}
49-
50-
51-p {
52- margin-top: .35ex;
53- margin-bottom: 10px;
54-}
55-
56-a {
57- color: cyan;
58- text-decoration: none;
59-}
60-
61-a:hover, a:focus {
62- color: violet;
63- text-decoration: underline;
64-}
65-
66-.breadcrumbs {
67- color: #363636;
68- background: #f5f5f5;
69-}
70-
71-/*.navbar a {
72- color: #999;
73- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
74- text-decoration: none;
75-}
76-
77-.navbar a:hover, .navbar a:focus {
78- color: #fff;
79- text-decoration: none;
80-}*/
81-
82-.navbar {
83- background: #1b1b1b;
84- background: linear-gradient(#222, #111);
85- border-bottom: 1px solid #252525;
86-}
87-
88-.navbar {
89- width: 100%;
90- position: fixed;
91- z-index: 1000;
92- margin: 0;
93- padding-top: .3em;
94- padding-bottom: .3em;
95- left: 0; right: 0;
96- top: 0;
97-}
98-
99-.navbar .internal {
100- max-width: 97%;
101- margin-left: auto;
102- margin-right: auto;
103-}
104-
105-.navbar li {
106- margin-top: .3em;
107- float: left;
108- margin-right: .6em;
109- margin-left: .3em;
110- list-style-type: none;
111-}
112-
113-.navbar li.right {
114- padding-left: .4em;
115- padding-right: .4em;
116- margin-top: .3em;
117- margin-right: 1.7em;
118- float: right;
119- list-style-type: none;
120- background: #333;
121- border-radius: 100%;
122-}
123-
124-.content {
125- max-width: 680px;
126- margin-left: auto;
127- margin-right: auto;
128-}
129-
130-.hyperscroll > .content {
131- max-width: 680px;
132- margin-left: auto;
133- margin-right: auto;
134-}
135-
136-.message, .message > *, .navbar, .navbar > * {
137- animation: fadein .5s;
138-}
139-
140-@keyframes fadein {
141- from { opacity: 0; }
142- to { opacity: 1; }
143-}
144-
145-.message {
146- display: block;
147- margin: .6em;
148- background: #111;
149- padding: .7em;
150- border-radius: 3px;
151- border: 1px solid #252525;
152-}
153-
154-.message:hover, .embedded:hover {
155- background: #141414;
156-}
157-
158-.message img, .message video {
159- max-width: 100%;
160-}
161-
162-img {
163- border-radius: 3px;
164-}
165-
166-.timestamp, .votes {
167- float: right;
168-}
169-
170-.avatar--small img {
171- vertical-align: top;
172- width: 1.4em;
173- height: 1.4em;
174- margin-right: .2em;
175-}
176-
177-.avatar--medium img {
178- float: left;
179- vertical-align: top;
180- width: 5em;
181- height: 5em;
182- margin-right: .5em;
183- margin-bottom: .5em;
184-}
185-
186-.compose, textarea, input {
187- font-family: sans-serif;
188- font-size: 14px;
189- line-height: 20px;
190- background: #111;
191- color: #ccc;
192- border: none;
193- border-radius: 3px;
194-}
195-
196-textarea {
197- width: 100%;
198- height: 200px;
199-}
200-
201-.compose:hover {
202- background: #141414;
203-}
204-
205-.compose:focus {
206- outline: none;
207-}
208-
209-.emoji {
210- padding: .2em;
211-}
212-
213-.right {
214- float: right;
215- margin-right: .25em;
216-}
217-
218-.emoji {
219- *float: left;
220- width: 1em;
221- vertical-align: top;
222-}
223-
224-pre {
225- width: 100%;
226- display: block;
227-}
228-
229-code {
230- display: inline-block;
231- vertical-align: bottom;
232-}
233-
234-code, pre {
235-overflow: auto;
236-word-break: break-all;
237-word-wrap: break-word;
238-white-space: pre;
239-white-space: -moz-pre-wrap;
240-white-space: pre-wrap;
241-white-space: pre\9;
242-}
243-
244-code, pre {
245- font-size: 12px;
246- color: #ccc;
247-}
248-
249-code {
250- color: #ccc;
251-}
252-
253-pre {
254- margin: 0 0 10px;
255- font-size: 13px;
256- line-height: 20px;
257-}
258-
259-button {margin: 0; margin-top: -.2em;}
260-
261-input {width: 88%; }
262-
263-#profile input {width: 50%;}
264-
265-.btn {
266- display: inline-block;
267- *display: inline;
268- padding: 2px 6px;
269- margin-bottom: 0;
270- margin-right: .2em;
271- font-size: 14px;
272- line-height: 20px;
273- color: #d5d5d5;
274- text-align: center;
275- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
276- vertical-align: middle;
277- cursor: pointer;
278- background-color: #222;
279- border: 1px solid #222;
280- border-radius: 4px;
281-}
282-
283-
284-.btn:hover,
285-.btn:focus,
286-.btn:active,
287-.btn.active,
288-.btn.disabled,
289-.btn[disabled] {
290- color: white;
291- background-color: black;
292-}
293-
294-.btn:active,
295-.btn.active {
296- background-color: #111;
297-}
298-
299-.btn:first-child {
300- *margin-left: 0;
301-}
302-
style.css.jsonView
@@ -1,1 +1,0 @@
1-"body {\n margin: 0;\n background: black;\n font-family: sans-serif;\n color: #f5f5f5;\n font-size: 14px; \n line-height: 20px;\n}\n\n#screen {\n position: absolute;\n top: 35px;\n bottom: 0px;\n left: 0px;\n right: 0px;\n}\n\n.hyperscroll {\n width: 100%;\n}\n\n.search {\n margin-top: 1.5px;\n float: right;\n width: 200px;\n}\n\n.header {\n padding-bottom: .7em;\n border-bottom: 1px solid #252525;\n}\n\nmark p, mark a {\n color: black;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-size: 1.2em;\n margin-top: .35ex;\n}\n\nhr {\n border: solid #222;\n clear: both;\n border-width: 1px 0 0;\n height: 0;\n margin-bottom: .9em;\n}\n\n\np {\n margin-top: .35ex;\n margin-bottom: 10px;\n}\n\na {\n color: cyan;\n text-decoration: none;\n}\n\na:hover, a:focus {\n color: violet;\n text-decoration: underline; \n}\n\n.breadcrumbs {\n color: #363636;\n background: #f5f5f5;\n}\n\n/*.navbar a {\n color: #999;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n text-decoration: none;\n}\n\n.navbar a:hover, .navbar a:focus {\n color: #fff;\n text-decoration: none;\n}*/\n\n.navbar {\n background: #1b1b1b;\n background: linear-gradient(#222, #111);\n border-bottom: 1px solid #252525;\n}\n\n.navbar {\n width: 100%;\n position: fixed;\n z-index: 1000;\n margin: 0;\n padding-top: .3em;\n padding-bottom: .3em;\n left: 0; right: 0;\n top: 0;\n}\n\n.navbar .internal {\n max-width: 97%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.navbar li {\n margin-top: .3em;\n float: left;\n margin-right: .6em;\n margin-left: .3em;\n list-style-type: none;\n}\n\n.navbar li.right {\n padding-left: .4em;\n padding-right: .4em;\n margin-top: .3em;\n margin-right: 1.7em;\n float: right;\n list-style-type: none;\n background: #333;\n border-radius: 100%;\n}\n\n.content {\n max-width: 680px;\n margin-left: auto;\n margin-right: auto;\n}\n\n.hyperscroll > .content {\n max-width: 680px;\n margin-left: auto;\n margin-right: auto;\n}\n\n.message, .message > *, .navbar, .navbar > * {\n animation: fadein .5s;\n}\n\n@keyframes fadein {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.message {\n display: block;\n margin: .6em;\n background: #111;\n padding: .7em;\n border-radius: 3px;\n border: 1px solid #252525;\n}\n\n.message:hover, .embedded:hover {\n background: #141414;\n}\n\n.message img, .message video {\n max-width: 100%;\n}\n\nimg {\n border-radius: 3px;\n}\n\n.timestamp, .votes {\n float: right;\n}\n \n.avatar--small img {\n vertical-align: top;\n width: 1.4em;\n height: 1.4em;\n margin-right: .2em;\n}\n\n.avatar--medium img {\n float: left;\n vertical-align: top;\n width: 5em;\n height: 5em;\n margin-right: .5em;\n margin-bottom: .5em;\n}\n\n.compose, textarea, input {\n font-family: sans-serif;\n font-size: 14px;\n line-height: 20px;\n background: #111;\n color: #ccc;\n border: none;\n border-radius: 3px;\n}\n\ntextarea {\n width: 100%;\n height: 200px;\n}\n\n.compose:hover {\n background: #141414;\n}\n\n.compose:focus {\n outline: none;\n}\n\n.emoji {\n padding: .2em;\n}\n\n.right {\n float: right;\n margin-right: .25em;\n}\n\n.emoji {\n *float: left;\n width: 1em;\n vertical-align: top;\n}\n\npre {\n width: 100%;\n display: block;\n}\n\ncode {\n display: inline-block;\n vertical-align: bottom;\n}\n\ncode, pre {\noverflow: auto;\nword-break: break-all;\nword-wrap: break-word;\nwhite-space: pre;\nwhite-space: -moz-pre-wrap;\nwhite-space: pre-wrap;\nwhite-space: pre\\9;\n}\n\ncode, pre {\n font-size: 12px;\n color: #ccc;\n}\n\ncode {\n color: #ccc;\n}\n\npre {\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 20px;\n}\n\nbutton {margin: 0; margin-top: -.2em;}\n\ninput {width: 88%; }\n\n#profile input {width: 50%;}\n\n.btn {\n display: inline-block;\n *display: inline;\n padding: 2px 6px;\n margin-bottom: 0;\n margin-right: .2em;\n font-size: 14px;\n line-height: 20px;\n color: #d5d5d5;\n text-align: center;\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);\n vertical-align: middle;\n cursor: pointer;\n background-color: #222;\n border: 1px solid #222;\n border-radius: 4px;\n}\n\n\n.btn:hover,\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n color: white;\n background-color: black;\n}\n\n.btn:active,\n.btn.active {\n background-color: #111;\n}\n\n.btn:first-child {\n *margin-left: 0;\n}\n\n"
style.jsView
@@ -1,8 +1,0 @@
1-var fs = require('fs')
2-var path = require('path')
3-
4-fs.writeFileSync(
5- path.join(__dirname, 'style.css.json'),
6- JSON.stringify(fs.readFileSync(path.join(__dirname, 'style.css'), 'utf8'))
7-)
8-
tools.jsView
@@ -1,596 +1,0 @@
1-var h = require('hyperscript')
2-var human = require('human-time')
3-var avatar = require('./avatar')
4-var ref = require('ssb-ref')
5-
6-var ssbKeys = require('ssb-keys')
7-
8-var pull = require('pull-stream')
9-
10-var sbot = require('./scuttlebot')
11-
12-var config = require('./config')()
13-
14-var id = require('./keys').id
15-
16-
17-module.exports.getBlocks = function (src) {
18- var blocks = h('div.blocks', 'Blocking: ')
19-
20- pull(
21- sbot.query({query: [{$filter: { value: { author: src, content: {type: 'contact'}}}}], live: true}),
22- pull.drain(function (msg) {
23- if (msg.value) {
24- if (msg.value.content.blocking == true) {
25- console.log(msg.value)
26- var gotIt = document.getElementById('blocks:' + msg.value.content.contact.substring(0, 44))
27- if (gotIt == null) {
28- blocks.appendChild(h('a#blocks:'+ msg.value.content.contact.substring(0, 44), {title: avatar.cachedName(msg.value.content.contact).textContent, href: '#' + msg.value.content.contact}, h('span.avatar--small', avatar.cachedImage(msg.value.content.contact))))
29- }
30- }
31- if (msg.value.content.blocking == false) {
32- var gotIt = document.getElementById('blocks:' + msg.value.content.contact.substring(0, 44))
33- if (gotIt != null) {
34- gotIt.outerHTML = ''
35- }
36- }
37- }
38- })
39- )
40-
41- return blocks
42-
43-}
44-
45-module.exports.getBlocked = function (src) {
46- var blocked = h('div.blocked', 'Blocked by: ')
47-
48- pull(
49- sbot.query({query: [{$filter: { value: { content: {type: 'contact', contact: src}}}}], live: true}),
50- pull.drain(function (msg) {
51- if (msg.value) {
52- if (msg.value.content.blocking == true) {
53- console.log(msg.value)
54- var gotIt = document.getElementById('blocked:' + msg.value.content.contact.substring(0, 44))
55- if (gotIt == null) {
56- blocked.appendChild(h('a#blocked:'+ msg.value.author.substring(0, 44), {title: avatar.cachedName(msg.value.author).textContent, href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))))
57- }
58- }
59- if (msg.value.content.blocking == false) {
60- var gotIt = document.getElementById('blocked:' + msg.value.author.substring(0, 44))
61- if (gotIt != null) {
62- gotIt.outerHTML = ''
63- }
64- }
65- }
66- })
67- )
68-
69- return blocked
70-
71-}
72-
73-module.exports.getFollowing = function (src) {
74- var followingCount = 0
75-
76- var following = h('div.following', 'Following: ')
77-
78- following.appendChild(h('span#followingcount', '0'))
79- following.appendChild(h('br'))
80-
81- pull(
82- sbot.query({query: [{$filter: { value: { author: src, content: {type: 'contact'}}}}], live: true}),
83- pull.drain(function (msg) {
84- if (msg.value) {
85- if (msg.value.content.following == true) {
86- followingcount = document.getElementById('followingcount')
87- followingCount++
88- followingcount.textContent = followingCount
89- var gotIt = document.getElementById('following:' + msg.value.content.contact.substring(0, 44))
90- if (gotIt == null) {
91- following.appendChild(h('a#following:'+ msg.value.content.contact.substring(0, 44), {title: avatar.cachedName(msg.value.content.contact).textContent, href: '#' + msg.value.content.contact}, h('span.avatar--small', avatar.cachedImage(msg.value.content.contact))))
92- }
93- }
94- if (msg.value.content.following == false) {
95- followingcount = document.getElementById('followingcount')
96- followingCount--
97- followingcount.textContent = followingCount
98- var gotIt = document.getElementById('following:' + msg.value.content.contact.substring(0, 44))
99- if (gotIt != null) {
100- gotIt.outerHTML = ''
101- }
102- }
103- }
104- })
105- )
106- return following
107-}
108-
109-module.exports.getFollowers = function (src) {
110- var followerCount = 0
111-
112- var followers = h('div.followers', 'Followers: ')
113-
114- followers.appendChild(h('span#followercount', '0'))
115- followers.appendChild(h('br'))
116-
117- pull(
118- sbot.query({query: [{$filter: { value: { content: {type: 'contact', contact: src}}}}], live: true}),
119- pull.drain(function (msg) {
120- if (msg.value) {
121- if (msg.value.content.following == true) {
122- followcount = document.getElementById('followercount')
123- followerCount++
124- followcount.textContent = followerCount
125- var gotIt = document.getElementById('followers:' + msg.value.author.substring(0, 44))
126- if (gotIt == null) {
127- followers.appendChild(h('a#followers:'+ msg.value.author.substring(0, 44), {title: avatar.cachedName(msg.value.author).textContent, href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))))
128- }
129- }
130- if (msg.value.content.following == false) {
131- followcount = document.getElementById('followercount')
132- followerCount--
133- followcount.textContent = followerCount
134- var gotIt = document.getElementById('followers:' + msg.value.author.substring(0, 44))
135- if (gotIt != null) {
136- gotIt.outerHTML = ''
137- }
138- }
139- }
140- })
141- )
142-
143- return followers
144-}
145-
146-module.exports.queueButton = function (src) {
147- var queueButton = h('span.queue:' + src.key.substring(0,44))
148-
149- var addToQueue = h('button.btn.right', 'Queue', {
150- onclick: function () {
151- var content = {
152- type: 'queue',
153- message: src.key,
154- queue: true
155- }
156- sbot.publish(content, function (err, publish) {
157- if (err) throw err
158- console.log(publish)
159- })
160- }
161- })
162-
163- var removeFromQueue = h('button.btn.right#', 'Done', {
164- onclick: function () {
165- var content = {
166- type: 'queue',
167- message: src.key,
168- queue: false
169- }
170- sbot.publish(content, function (err, publish) {
171- if (err) throw err
172- console.log(publish)
173- if (window.location.hash.substring(1) == 'queue') {
174- setTimeout(function () {
175- var gotIt = document.getElementById(src.key.substring(0,44))
176- if (gotIt != null) {
177- gotIt.outerHTML = ''
178- }
179- }, 100)
180-
181- }
182- })
183- }
184- })
185-
186- pull(
187- sbot.query({query: [{$filter: { value: { author: id, content: {type: 'queue', message: src.key}}}}], live: true}),
188- pull.drain(function (msg) {
189- if (msg.value) {
190- if (msg.value.content.queue == true) {
191- queueButton.removeChild(queueButton.childNodes[0])
192- queueButton.appendChild(removeFromQueue)
193- }
194- if (msg.value.content.queue == false) {
195- queueButton.removeChild(queueButton.childNodes[0])
196- queueButton.appendChild(addToQueue)
197- }
198- }
199- })
200- )
201-
202- queueButton.appendChild(addToQueue)
203-
204- return queueButton
205-}
206-module.exports.block = function (src) {
207- var button = h('span.button')
208-
209- var followButton = h('button.btn', 'Block (Private)', avatar.name(src), {
210- onclick: function () {
211- var content = {
212- type: 'contact',
213- contact: src,
214- blocking: true,
215- recps: id
216- }
217- sbot.publish(content, function (err, publish) {
218- if (err) throw err
219- console.log(publish)
220- })
221- }
222- })
223-
224- var unfollowButton = h('button.btn', 'Unblock (Private)', avatar.name(src), {
225- onclick: function () {
226- var content = {
227- type: 'contact',
228- contact: src,
229- blocking: false,
230- recps: id
231- }
232- sbot.publish(content, function (err, publish) {
233- if (err) throw err
234- console.log(publish)
235- })
236- }
237- })
238-
239- pull(
240- sbot.query({query: [{$filter: { value: { author: id, content: {type: 'contact', contact: src}}}}], live: true}),
241- pull.drain(function (msg) {
242- if (msg.value) {
243- if (msg.value.content.blocking == true) {
244- button.removeChild(button.firstChild)
245- button.appendChild(unfollowButton)
246- }
247- if (msg.value.content.blocking == false) {
248- button.removeChild(button.firstChild)
249- button.appendChild(followButton)
250- }
251- }
252- })
253- )
254-
255- button.appendChild(followButton)
256-
257- return button
258-}
259-
260-module.exports.box = function (content) {
261- return ssbKeys.box(content, content.recps.map(function (e) {
262- return ref.isFeed(e) ? e : e.link
263- }))
264-}
265-
266-module.exports.publish = function (content, cb) {
267- if(content.recps)
268- content = exports.box(content)
269- sbot.publish(content, function (err, msg) {
270- if(err) throw err
271- console.log('Published!', msg)
272- if(cb) cb(err, msg)
273- })
274-}
275-
276-
277-
278-module.exports.follow = function (src) {
279- var button = h('span.button')
280-
281- var followButton = h('button.btn', 'Follow ', avatar.name(src), {
282- onclick: function () {
283- var content = {
284- type: 'contact',
285- contact: src,
286- following: true
287- }
288- sbot.publish(content, function (err, publish) {
289- if (err) throw err
290- console.log(publish)
291- })
292- }
293- })
294-
295- var unfollowButton = h('button.btn', 'Unfollow ', avatar.name(src), {
296- onclick: function () {
297- var content = {
298- type: 'contact',
299- contact: src,
300- following: false
301- }
302- sbot.publish(content, function (err, publish) {
303- if (err) throw err
304- console.log(publish)
305- })
306- }
307- })
308-
309- pull(
310- sbot.query({query: [{$filter: { value: { author: id, content: {type: 'contact', contact: src}}}}], live: true}),
311- pull.drain(function (msg) {
312- if (msg.value) {
313- if (msg.value.content.following == true) {
314- button.removeChild(button.firstChild)
315- button.appendChild(unfollowButton)
316- }
317- if (msg.value.content.following == false) {
318- button.removeChild(button.firstChild)
319- button.appendChild(followButton)
320- }
321- }
322- })
323- )
324-
325- button.appendChild(followButton)
326-
327- return button
328-}
329-
330-module.exports.box = function (content) {
331- return ssbKeys.box(content, content.recps.map(function (e) {
332- return ref.isFeed(e) ? e : e.link
333- }))
334-}
335-
336-module.exports.publish = function (content, cb) {
337- if(content.recps)
338- content = exports.box(content)
339- sbot.publish(content, function (err, msg) {
340- if(err) throw err
341- console.log('Published!', msg)
342- if(cb) cb(err, msg)
343- })
344-}
345-
346-
347-
348-module.exports.mute = function (src) {
349- if (!localStorage[src])
350- var cache = {mute: false}
351- else
352- var cache = JSON.parse(localStorage[src])
353-
354- if (cache.mute == true) {
355- var mute = h('button.btn', 'Unmute', {
356- onclick: function () {
357- cache.mute = false
358- localStorage[src] = JSON.stringify(cache)
359- location.hash = '#'
360- location.hash = src
361- }
362- })
363- return mute
364- } else {
365- var mute = h('button.btn', 'Mute', {
366- onclick: function () {
367- cache.mute = true
368- localStorage[src] = JSON.stringify(cache)
369- location.hash = '#'
370- location.hash = src
371- }
372- })
373- return mute
374- }
375-}
376-
377-module.exports.star = function (msg) {
378- var votebutton = h('span.star:' + msg.key.substring(0,44))
379-
380- var vote = {
381- type: 'vote',
382- vote: { link: msg.key, expression: 'Star' }
383- }
384-
385- if (msg.value.content.recps) {
386- vote.recps = msg.value.content.recps
387- }
388-
389- var star = h('button.btn.right', 'Star ',
390- h('img.emoji', {src: config.emojiUrl + 'star.png'}), {
391- onclick: function () {
392- vote.vote.value = 1
393- if (vote.recps) {
394- vote = exports.box(vote)
395- }
396- sbot.publish(vote, function (err, voted) {
397- if(err) throw err
398- })
399- }
400- }
401- )
402-
403- var unstar = h('button.btn.right ', 'Unstar ',
404- h('img.emoji', {src: config.emojiUrl + 'stars.png'}), {
405- onclick: function () {
406- vote.vote.value = -1
407- sbot.publish(vote, function (err, voted) {
408- if(err) throw err
409- })
410- }
411- }
412- )
413-
414- votebutton.appendChild(star)
415-
416- pull(
417- sbot.links({rel: 'vote', dest: msg.key, live: true}),
418- pull.drain(function (link) {
419- if (link.key) {
420- sbot.get(link.key, function (err, data) {
421- if (err) throw err
422- if (data.content.vote) {
423- if (data.author == id) {
424- while (votebutton.firstChild) {
425- votebutton.removeChild(votebutton.firstChild)
426- }
427- if (data.content.vote.value == 1)
428- //votebutton.removeChild(votebutton.childNodes[0])
429- votebutton.appendChild(unstar)
430- if (data.content.vote.value == -1)
431- //votebutton.removeChild(votebutton.childNodes[0])
432- votebutton.appendChild(star)
433- }
434- }
435- })
436- }
437- })
438- )
439-
440- return votebutton
441-}
442-
443-function votes (msg) {
444- var votes = h('div.votes.right')
445- if (msg.key) {
446- pull(
447- sbot.links({rel: 'vote', dest: msg.key, live: true }),
448- pull.drain(function (link) {
449- if (link.key) {
450- sbot.get(link.key, function (err, data) {
451- if (err) throw err
452- if (data.content.vote) {
453- if (data.content.vote.value == 1) {
454- if (localStorage[data.author + 'name'])
455- name = localStorage[data.author + 'name']
456- else
457- name = data.author
458- votes.appendChild(h('a#vote:' + data.author.substring(0, 44), {href:'#' + data.author, title: name}, h('img.emoji', {src: config.emojiUrl + 'star.png'})))
459- }
460- else if (data.content.vote.value == -1) {
461- var lookFor = 'vote:' + data.author.substring(0, 44)
462- document.getElementById(lookFor, function (err, gotit) {
463- if (err) throw err
464- gotit.parentNode.removeChild(remove)
465- })
466- }
467- }
468- })
469- }
470- })
471- )
472- }
473- return votes
474-}
475-
476-module.exports.timestamp = function (msg, edited) {
477- var timestamp
478- if (edited)
479- timestamp = h('span.timestmap.right', 'Edited by: ', h('a', {href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))), h('a', {href: '#' + msg.key}, human(new Date(msg.value.timestamp))))
480- else
481- timestamp = h('span.timestamp.right', h('a', {href: '#' + msg.key}, human(new Date(msg.value.timestamp))))
482- return timestamp
483-}
484-
485-
486-module.exports.mini = function (msg, content) {
487- var mini = h('div.mini')
488-
489- mini.appendChild(
490- h('span.avatar',
491- h('a', {href: '#' + msg.value.author},
492- h('span.avatar--small', avatar.cachedImage(msg.value.author)),
493- avatar.cachedName(msg.value.author)
494- )
495- )
496- )
497- var lock = h('span.right', h('img.emoji', {src: config.emojiUrl + 'lock.png'}))
498-
499-
500- mini.appendChild(h('span', content))
501- mini.appendChild(exports.timestamp(msg))
502-
503- if (msg.value.content.recps) {
504- mini.appendChild(lock)
505- }
506-
507- if (typeof msg.value.content === 'string') {
508- mini.appendChild(lock)
509- }
510-
511- return mini
512-}
513-
514-module.exports.header = function (msg) {
515- var header = h('div.header')
516-
517- header.appendChild(h('span.avatar',
518- h('a', {href: '#' + msg.value.author},
519- h('span.avatar--small', avatar.cachedImage(msg.value.author)),
520- avatar.cachedName(msg.value.author)
521- )
522- )
523- )
524-
525- header.appendChild(exports.timestamp(msg))
526- header.appendChild(votes(msg))
527-
528- if (msg.value.private) {
529- header.appendChild(h('span.right', ' ', h('img.emoji', {src: config.emojiUrl + 'lock.png'})))
530- }
531- if (msg.value.content.type == 'edit') {
532- header.appendChild(h('span.right', ' Edited: ', h('a', {href: '#' + msg.value.content.original}, exports.messageLink(msg.value.content.original))))
533- }
534- return header
535-}
536-
537-
538-
539-
540-module.exports.messageName = function (id, cb) {
541- // gets the first few characters of a message, for message-link
542- function title (s) {
543- var m = /^\n*([^\n]{0,40})/.exec(s)
544- return m && (m[1].length == 40 ? m[1]+'...' : m[1])
545- }
546-
547- sbot.get(id, function (err, value) {
548- if(err && err.name == 'NotFoundError')
549- return cb(null, id.substring(0, 10)+'...(missing)')
550- if(value.content.type === 'post' && 'string' === typeof value.content.text)
551- return cb(null, title(value.content.text))
552- else if('string' === typeof value.content.text)
553- return cb(null, value.content.type + ':'+title(value.content.text))
554- else
555- return cb(null, id.substring(0, 10)+'...')
556- })
557-}
558-
559-var messageName = exports.messageName
560-
561-module.exports.messageLink = function (id) {
562- if (ref.isMsg(id)) {
563- var link = h('a', {href: '#'+id}, id.substring(0, 10)+'...')
564- messageName(id, function (err, name) {
565- if(err) console.error(err)
566- else link.textContent = name
567- })
568- } else {
569- var link = id
570- }
571- return link
572-}
573-
574-module.exports.rawJSON = function (obj) {
575- return JSON.stringify(obj, null, 2)
576- .split(/([%@&][a-zA-Z0-9\/\+]{43}=*\.[\w]+)/)
577- .map(function (e) {
578- if(ref.isMsg(e) || ref.isFeed(e) || ref.isBlob(e)) {
579- return h('a', {href: '#' + e}, e)
580- }
581- return e
582- })
583-}
584-
585-var markdown = require('ssb-markdown')
586-var config = require('./config')()
587-
588-module.exports.markdown = function (msg, md) {
589- return {innerHTML: markdown.block(msg, {toUrl: function (url, image) {
590- if(url[0] == '%' || url[0] == '@' || url[0] == '#') return '#' + url
591- if(url[0] !== '&') return url
592- //if(url[0] == '&') return config.blobsUrl + url
593- //if(!image) return url
594- return config.blobsUrl + url
595- }})}
596-}
views.jsView
@@ -1,756 +1,0 @@
1-var pull = require('pull-stream')
2-var human = require('human-time')
3-var sbot = require('./scuttlebot')
4-var hyperscroll = require('hyperscroll')
5-var hyperfile = require('hyperfile')
6-var dataurl = require('dataurl-')
7-var More = require('pull-more')
8-var stream = require('hyperloadmore/stream')
9-var h = require('hyperscript')
10-var render = require('./render')
11-var ref = require('ssb-ref')
12-var client = require('ssb-client')
13-var Next = require('pull-next-query')
14-var config = require('./config')()
15-var tools = require('./tools')
16-var avatar = require('./avatar')
17-var id = require('./keys').id
18-var ssbKeys = require('ssb-keys')
19-var keys = require('./keys')
20-var compose = require('./compose')
21-
22-
23-var labelStream = function (label){
24- var content = h('div.content')
25- var screen = document.getElementById('screen')
26- screen.appendChild(hyperscroll(content))
27- content.appendChild(h('div.breadcrumbs.message', h('a', {href: '/'}, 'label'), ' ⯈ ' , h('a', {href: '/#label/' + label}, label)))
28- function createStream (opts) {
29- return pull(
30- Next(sbot.query, opts, ['value', 'timestamp']),
31- pull.map(function (msg){
32- if (msg.value) {
33- sbot.get(msg.value.content.link, function (err, data) {
34- if (data) {
35- var message = {}
36- message.value = data
37- message.key = msg.value.content.link
38- content.appendChild(render(message))
39- }
40- })
41- }
42- })
43- )
44- }
45-
46- pull(
47- createStream({
48- limit: 10,
49- reverse: true,
50- live: false,
51- query: [{$filter: { value: { content: {type: 'label', label: label }, timestamp: { $gt: 0 }}}}]
52- }),
53- stream.bottom(content)
54- )
55-
56- pull(
57- createStream({
58- limit: 10,
59- old: false,
60- live: true,
61- query: [{$filter: { value: { content: {type: 'label', label: label }, timestamp: { $gt: 0 }}}}]
62- }),
63- stream.top(content)
64- )
65-}
66-
67-
68-var privateStream = function () {
69- var screen = document.getElementById('screen')
70- var content = h('div.content')
71-
72- screen.appendChild(hyperscroll(content))
73-
74- function createStream (opts) {
75- return pull(
76- Next(sbot.query, opts, ['value', 'timestamp']),
77- pull.filter(function (msg) {
78- return ((msg.value.private == true) || ('string' == typeof msg.value.content))
79- }),
80- pull.map(function (msg) {
81- /*if (msg.value.private != true) {
82- var unboxed = ssbKeys.unbox(msg.value.content, keys)
83- if (unboxed) {
84- msg.value.content = unboxed
85- msg.value.private = true
86- return render(msg)
87- } else {
88- return render(msg)
89- }
90- } else {return render(msg)}*/
91- return render(msg)
92- })
93- )
94- }
95-
96- pull(
97- createStream({
98- limit: 100,
99- reverse: true,
100- live: false,
101- query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
102- }),
103- stream.bottom(content)
104- )
105-
106- pull(
107- createStream({
108- limit: 100,
109- old: false,
110- live: true,
111- query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
112- }),
113- stream.top(content)
114- )
115-
116-
117- /*function createStream (opts) {
118- return pull(
119- Next(sbot.query, opts, ['value', 'timestamp']),
120- pull.map(function (msg) {
121- if (msg.value) {
122- if (msg.value.timestamp > Date.now()) {
123- return h('div.future')
124- } else {
125- return render(msg)
126- }
127- }
128- })
129- )
130- }
131-
132- pull(
133- createStream({
134- limit: 10,
135- reverse: true,
136- live: false,
137- query: [{$filter: { value: { private: true, timestamp: { $gt: 0 }}}}]
138- }),
139- stream.bottom(content)
140- )
141-
142- pull(
143- createStream({
144- limit: 10,
145- old: false,
146- live: true,
147- query: [{$filter: { value: { private: true, timestamp: { $gt: 0 }}}}]
148- }),
149- stream.top(content)
150- )*/
151-
152-
153- /*function createStream (opts) {
154- return pull(
155- More(sbot.createLogStream, opts),
156- pull.filter(function (msg) {
157- return 'string' == typeof msg.value.content
158- }),
159- pull.filter(function (msg) {
160- var unboxed = ssbKeys.unbox(msg.value.content, keys)
161- if (unboxed) {
162- msg.value.content = unboxed
163- msg.value.private = true
164- return msg
165- } else {
166- return msg
167- }
168- }),
169- pull.map(function (msg) {
170- return render(msg)
171- })
172- )
173- }
174-
175- pull(
176- createStream({old: false, limit: 1000}),
177- stream.top(content)
178- )
179-
180- pull(
181- createStream({reverse: true, live: false, limit: 1000}),
182- stream.bottom(content)
183- )*/
184-}
185-
186-var queueStream = function () {
187- var content = h('div.content')
188- var screen = document.getElementById('screen')
189- screen.appendChild(hyperscroll(content))
190-
191- pull(
192- sbot.query({query: [{$filter: { value: {author: id, content: {type: 'queue'}}}}]}),
193- pull.drain(function (msg) {
194- if (msg.value) {
195- if (ref.isMsg(msg.value.content.message)) {
196- if (msg.value.content.queue == true) {
197- sbot.get(msg.value.content.message, function (err, data) {
198- if (data) {
199- var message = {}
200- message.value = data
201- message.key = msg.value.content.message
202- content.appendChild(render(message))
203- }
204- })
205- }
206- if (msg.value.content.queue == false) {
207- setTimeout(function () {
208- var gotIt = document.getElementById(msg.value.content.message.substring(0,44))
209- if (gotIt != null) {
210- gotIt.outerHTML = ''
211- }
212- }, 100)
213- }
214- }
215- }
216- })
217- )
218-}
219-
220-var mentionsStream = function (src) {
221- var content = h('div.content')
222-
223- var screen = document.getElementById('screen')
224-
225- screen.appendChild(hyperscroll(content))
226-
227- function createStream (opts) {
228- return pull(
229- Next(sbot.backlinks, opts, ['value', 'timestamp']),
230- pull.map(function (msg) {
231- if (msg.value.private == true) return h('div.private')
232- return render(msg)
233- })
234- )
235- }
236-
237- pull(
238- createStream({
239- limit: 10,
240- reverse: true,
241- index: 'DTA',
242- live: false,
243- query: [{$filter: {dest: src}}]
244- }),
245- stream.bottom(content)
246- )
247-
248- pull(
249- createStream({
250- limit: 10,
251- old: false,
252- index: 'DTA',
253- live: true,
254- query: [{$filter: {dest: src}}]
255- }),
256- stream.top(content)
257- )
258-}
259-
260-var userStream = function (src) {
261- var content = h('div.content')
262- var screen = document.getElementById('screen')
263-
264- screen.appendChild(hyperscroll(content))
265-
266- function createStream (opts) {
267- return pull(
268- More(sbot.userStream, opts, ['value', 'sequence']),
269- pull.map(function (msg) {
270- return render(h('div', msg))
271- })
272- )
273- }
274-
275- pull(
276- createStream({old: false, limit: 10, id: src}),
277- stream.top(content)
278- )
279-
280- pull(
281- createStream({reverse: true, live: false, limit: 10, id: src}),
282- stream.bottom(content)
283- )
284-
285- var profile = h('div.content#profile', h('div.message'))
286-
287- if (screen.firstChild.firstChild) {
288- screen.firstChild.insertBefore(profile, screen.firstChild.firstChild)
289- } else {
290- screen.firstChild.appendChild(profile)
291- }
292-
293- var name = avatar.name(src)
294-
295- var editname = h('span',
296- avatar.name(src),
297- h('button.btn', 'New name', {
298- onclick: function () {
299- var nameput = h('input', {placeholder: name.textContent})
300- var nameedit =
301- h('span', nameput,
302- h('button.btn', 'Preview', {
303- onclick: function () {
304- if (nameput.value[0] != '@')
305- tobename = nameput.value
306- else
307- tobename = nameput.value.substring(1, 100)
308- var newname = h('span', h('a', {href: '#' + src}, '@' + tobename), h('button.btn', 'Publish', {
309- onclick: function () {
310- var donename = h('span', h('a', {href: '#' + src}, '@' + tobename))
311- sbot.publish({type: 'about', about: src, name: tobename})
312- localStorage[src + 'name'] = tobename
313- newname.parentNode.replaceChild(donename, newname)
314- }
315- }))
316- nameedit.parentNode.replaceChild(newname, nameedit)
317- }
318- })
319- )
320- editname.parentNode.replaceChild(nameedit, editname)
321- }
322- })
323- )
324-
325- var editimage = h('span',
326- h('button.btn', 'New image', {
327- onclick: function () {
328- var upload =
329- h('span',
330- hyperfile.asDataURL(function (data) {
331- if(data) {
332- //img.src = data
333- var _data = dataurl.parse(data)
334- pull(
335- pull.once(_data.data),
336- sbot.addblob(function (err, hash) {
337- if(err) return alert(err.stack)
338- selected = {
339- link: hash,
340- size: _data.data.length,
341- type: _data.mimetype
342- }
343- })
344- )
345- }
346- }),
347- h('button.btn', 'Preview image', {
348- onclick: function() {
349- if (selected) {
350- console.log(selected)
351- var oldImage = document.getElementById('profileImage')
352- var newImage = h('span.avatar--medium', h('img', {src: config.blobsUrl + selected.link}))
353- var publish = h('button.btn', 'Publish image', {
354- onclick: function () {
355- sbot.publish({
356- type: 'about',
357- about: src,
358- image: selected
359- }, function (err, published) {
360- console.log(published)
361- })
362- }
363- })
364- upload.parentNode.replaceChild(publish, upload)
365- oldImage.parentNode.replaceChild(newImage, oldImage)
366- }
367- /*if(selected) {
368- api.message_confirm({
369- type: 'about',
370- about: id,
371- image: selected
372- })
373- } else { alert('select an image before hitting preview')}*/
374- }
375- })
376- )
377- editimage.parentNode.replaceChild(upload, editimage)
378- }
379- })
380- )
381-
382- var avatars = h('div.avatars',
383- h('a', {href: '#' + src},
384- h('span.avatar--medium#profileImage', avatar.image(src)),
385- editname,
386- h('br'),
387- editimage
388- )
389- )
390-
391- pull(
392- sbot.userStream({id: src, reverse: false, limit: 1}),
393- pull.drain(function (msg) {
394- var howlong = h('span', h('br'), ' arrived ', human(new Date(msg.value.timestamp)))
395- avatars.appendChild(howlong)
396- console.log(msg)
397- })
398- )
399-
400-
401- var buttons = h('div.buttons')
402-
403- profile.firstChild.appendChild(avatars)
404- profile.firstChild.appendChild(buttons)
405- buttons.appendChild(tools.mute(src))
406-
407- var writeMessage = h('button.btn', 'Public message ', avatar.name(src), {
408- onclick: function () {
409- opts = {}
410- opts.type = 'post'
411- opts.mentions = '[' + name.textContent + '](' + src + ')'
412- var composer = h('div#composer', h('div.message', compose(opts)))
413- profile.appendChild(composer)
414- }
415- })
416-
417- var writePrivate = h('button.btn', 'Private message ', avatar.name(src), {
418- onclick: function () {
419- opts = {}
420- opts.type = 'post'
421- opts.mentions = '[' + name.textContent + '](' + src + ')'
422- opts.recps = [src, id]
423- var composer = h('div#composer', h('div.message', compose(opts)))
424- profile.appendChild(composer)
425- }
426- })
427-
428- buttons.appendChild(writeMessage)
429- buttons.appendChild(writePrivate)
430- buttons.appendChild(tools.follow(src))
431- buttons.appendChild(tools.block(src))
432-
433- buttons.appendChild(h('button.btn', 'Generate follows', {
434- onclick: function () {
435- profile.firstChild.appendChild(tools.getFollowing(src))
436- profile.firstChild.appendChild(tools.getFollowers(src))
437- }
438- }))
439-
440- buttons.appendChild(h('button.btn', 'Generate blocks', {
441- onclick: function () {
442- profile.firstChild.appendChild(tools.getBlocks(src))
443- profile.firstChild.appendChild(tools.getBlocked(src))
444- }
445- }))
446- buttons.appendChild(h('a', {href: '#wall/' + src}, h('button.btn', avatar.name(src), "'s wall")))
447-
448-}
449-
450-var privateMsg = function (src) {
451- var content = h('div.content')
452- var screen = document.getElementById('screen')
453- screen.appendChild(hyperscroll(content))
454-
455- sbot.get(src, function (err, data) {
456- if (err) {
457- var message = h('div.message', 'Missing message!')
458- content.appendChild(message)
459- }
460- if (data) {
461- console.log(data)
462- data.value = data
463- data.key = src
464-
465- content.appendChild(render(data))
466- }
467-
468- })
469-}
470-
471-var msgThread = function (src) {
472-
473- var content = h('div.content')
474- var screen = document.getElementById('screen')
475- screen.appendChild(hyperscroll(content))
476-
477- pull(
478- sbot.query({query: [{$filter: { value: { content: {root: src}, timestamp: { $gt: 1 }}}}], live: true}),
479- pull.drain(function (msg) {
480- if (msg.value) {
481- content.appendChild(render(msg))
482- }
483- })
484- )
485-
486- sbot.get(src, function (err, data) {
487- if (err) {
488- var message = h('div.message', 'Missing message!')
489- content.appendChild(message)
490- }
491- if (data) {
492- var message = {}
493- message.value = data
494- message.key = src
495- console.log(message)
496- var rootMsg = render(message)
497-
498- if (content.firstChild) {
499- content.insertBefore(rootMsg, content.firstChild)
500- } else {
501- content.appendChild(rootMsg)
502- }
503- if (message.value.content.type == 'git-repo') {
504- pull(
505- sbot.backlinks({query: [{$filter: {value: {content: {type: 'git-update'}}, dest: src}}]}),
506- pull.drain(function (msg) {
507- if (msg.value) {
508- content.appendChild(render(msg))
509- }
510- })
511- )
512- }
513-
514- }
515- })
516-
517-}
518-
519-var keyPage = function () {
520- var screen = document.getElementById('screen')
521-
522- var importKey = h('textarea.import', {placeholder: 'Import a new public/private key', name: 'textarea', style: 'width: 97%; height: 100px;'})
523-
524- var content = h('div.content',
525- h('div.message#key',
526- h('h1', 'Your Key'),
527- h('p', {innerHTML: 'Your public/private key is: <pre><code>' + localStorage[config.caps.shs + '/secret'] + '</code></pre>'},
528- h('button.btn', {onclick: function (e){
529- localStorage[config.caps.shs +'/secret'] = ''
530- alert('Your public/private key has been deleted')
531- e.preventDefault()
532- location.hash = ""
533- location.reload()
534- }}, 'Delete Key')
535- ),
536- h('hr'),
537- h('form',
538- importKey,
539- h('button.btn', {onclick: function (e){
540- if(importKey.value) {
541- localStorage[config.caps.shs + '/secret'] = importKey.value.replace(/\s+/g, ' ')
542- e.preventDefault()
543- alert('Your public/private key has been updated')
544- }
545- location.hash = ""
546- location.reload()
547- }}, 'Import key'),
548- )
549- )
550- )
551-
552- screen.appendChild(hyperscroll(content))
553-}
554-
555-
556-function friendsStream (src) {
557-
558- var screen = document.getElementById('screen')
559- var content = h('div.content')
560-
561- screen.appendChild(hyperscroll(content))
562-
563- function createStream (opts) {
564- return pull(
565- Next(sbot.query, opts, ['value', 'timestamp']),
566- pull.map(function (msg) {
567- sbot.friends.get({source: src, dest: msg.value.author}, function (err, data) {
568- if (data === true) {
569- return content.appendChild(render(msg))
570- console.log(msg)
571- } else {
572- return content.appendChild(h('div'))
573- }
574- })
575- })
576- )
577- }
578-
579- pull(
580- createStream({
581- limit: 1000,
582- reverse: true,
583- live: false,
584- query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
585- }),
586- stream.bottom(content)
587- )
588-
589-}
590-
591-function everythingStream () {
592-
593- var screen = document.getElementById('screen')
594- var content = h('div.content')
595-
596- screen.appendChild(hyperscroll(content))
597-
598- function createStream (opts) {
599- return pull(
600- Next(sbot.query, opts, ['value', 'timestamp']),
601- pull.map(function (msg) {
602- if (msg.value) {
603- if (msg.value.timestamp > Date.now()) {
604- return h('div.future')
605- } else {
606- return render(msg)
607- }
608- }
609- })
610- )
611- }
612-
613- pull(
614- createStream({
615- limit: 10,
616- reverse: true,
617- live: false,
618- query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
619- }),
620- stream.bottom(content)
621- )
622-
623- pull(
624- createStream({
625- limit: 10,
626- old: false,
627- live: true,
628- query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
629- }),
630- stream.top(content)
631- )
632-}
633-
634-
635-
636-
637-function backchannel () {
638-
639- var screen = document.getElementById('screen')
640- var content = h('div.content')
641-
642- screen.appendChild(hyperscroll(content))
643-
644- var chatbox = h('input', {placeholder: 'Backchannel'})
645-
646- var chat = h('div.content')
647-
648- var publish = h('button.btn', 'Publish', {
649- onclick: function () {
650- if (chatbox.value) {
651- var content = {
652- text: chatbox.value,
653- type: 'scat_message'
654- }
655- sbot.publish(content, function (err, msg) {
656- if (err) throw err
657- chatbox.value = ''
658- console.log('Published!', msg)
659- })
660- }
661- }
662- })
663-
664- chat.appendChild(h('div.message', chatbox, publish))
665-
666- if (screen.firstChild.firstChild) {
667- screen.firstChild.insertBefore(chat, screen.firstChild.firstChild)
668- } else {
669- screen.firstChild.appendChild(chat)
670- }
671-
672- function createStream (opts) {
673- return pull(
674- Next(sbot.query, opts, ['value', 'timestamp']),
675- pull.map(function (msg) {
676- if (msg.value) {
677- return render(msg)
678- }
679- })
680- )
681- }
682-
683- pull(
684- createStream({
685- limit: 10,
686- reverse: true,
687- live: false,
688- query: [{$filter: { value: { content: {type: 'scat_message'}, timestamp: { $gt: 0 }}}}]
689- }),
690- stream.bottom(content)
691- )
692-
693- pull(
694- createStream({
695- limit: 10,
696- old: false,
697- live: true,
698- query: [{$filter: { value: { content: {type: 'scat_message'}, timestamp: { $gt: 0 }}}}]
699- }),
700- stream.top(content)
701- )
702-}
703-
704-function search (src) {
705- console.log('search' + src)
706-
707- var content = h('div.content')
708- var screen = document.getElementById('screen')
709- screen.appendChild(hyperscroll(content))
710-
711- pull(
712- sbot.search.query({query: src, limit: 100}),
713- pull.drain(function (search) {
714- content.appendChild(render(search))
715- })
716- )
717-
718-}
719-
720-function hash () {
721- return window.location.hash.substring(1)
722-}
723-
724-module.exports = function () {
725- var src = hash()
726-
727- if (src.substring(52, 59) == '?unbox=') {
728- privateMsg(src)
729- } else if (ref.isFeed(src)) {
730- userStream(src)
731- } else if (ref.isMsg(src)) {
732- msgThread(src)
733- } else if (ref.isFeed(src.substring(5))) {
734- mentionsStream(src.substring(5))
735- } else if (ref.isFeed(src.substring(8))) {
736- friendsStream(src.substring(8))
737- } else if (src.substring(0, 6) === 'label/') {
738- labelStream(src.substring(6))
739- } else if (src == 'queue') {
740- queueStream()
741- } else if (src == 'backchannel') {
742- backchannel()
743- } else if (src == 'private') {
744- privateStream()
745- } else if (src == 'key') {
746- keyPage()
747- } else if (src[0] == '?' || (src[0] == '#')) {
748- if (src[0] == '#')
749- search(src.split('%20').join(' '))
750- else
751- search(src.substr(1).split('%20').join(' '))
752- } else {
753- everythingStream()
754- }
755-
756-}

Built with git-ssb-web