2016-03-07 21:42:05 +03:00
|
|
|
:: Twitter daemon
|
|
|
|
::
|
2016-04-08 05:16:04 +03:00
|
|
|
:::: /hoon/twit/app
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
2016-03-31 03:02:52 +03:00
|
|
|
/- plan-acct
|
2017-11-08 00:05:52 +03:00
|
|
|
/+ twitter, hall
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
|
|
|
:::: ~fyr
|
|
|
|
::
|
2016-12-07 06:13:33 +03:00
|
|
|
=, eyre
|
2016-12-03 02:09:58 +03:00
|
|
|
=, html
|
2016-03-07 21:42:05 +03:00
|
|
|
|%
|
|
|
|
++ twit-path :: valid peer path
|
2016-03-31 03:02:52 +03:00
|
|
|
$% {$cred $~} :: credential info
|
|
|
|
{$home p/@t $~} :: home timeline
|
2016-03-22 23:00:45 +03:00
|
|
|
{$user p/@t $~} :: user's tweets
|
|
|
|
{$post p/@taxuv $~} :: status of status
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
|
|
|
::
|
|
|
|
++ axle :: app state
|
2016-03-15 03:37:34 +03:00
|
|
|
$: $0
|
2016-03-22 23:00:45 +03:00
|
|
|
out/(map @uvI (each {knot cord} stat)) :: sent tweets
|
|
|
|
ran/(map path {p/@ud q/@da}) :: polls active
|
2016-03-15 03:37:34 +03:00
|
|
|
fed/(jar path stat) :: feed cache
|
2016-03-31 03:02:52 +03:00
|
|
|
ced/(unit (pair @da json)) :: credentials
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
|
|
|
::
|
|
|
|
++ gift :: subscription action
|
2016-03-15 03:37:34 +03:00
|
|
|
$% {$quit $~} :: terminate
|
|
|
|
{$diff gilt} :: send data
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
2017-11-08 00:05:52 +03:00
|
|
|
++ gilt
|
2016-03-15 03:37:34 +03:00
|
|
|
$% {$twit-feed p/(list stat)} :: posts in feed
|
2016-03-21 23:35:29 +03:00
|
|
|
{$twit-post p/stat} :: tweet accepted
|
2016-03-31 03:02:52 +03:00
|
|
|
{$ares term (list tank)} :: error
|
|
|
|
{$json json} :: unspecialized
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
|
|
|
::
|
2016-03-15 03:37:34 +03:00
|
|
|
++ move {bone card}
|
2016-03-07 21:42:05 +03:00
|
|
|
++ card :: arvo request
|
|
|
|
$? gift
|
2017-10-24 01:19:57 +03:00
|
|
|
$% {$hiss wire (unit user:eyre) api-call} :: api request
|
2016-03-31 03:04:27 +03:00
|
|
|
{$poke wire app-message} ::
|
2016-03-15 04:02:59 +03:00
|
|
|
{$wait wire p/@da} :: timeout
|
2016-03-07 21:42:05 +03:00
|
|
|
== ==
|
|
|
|
::
|
2016-03-15 04:02:59 +03:00
|
|
|
++ api-call {response-mark $twit-req {endpoint quay}} :: full hiss payload
|
2016-03-31 03:02:52 +03:00
|
|
|
++ response-mark ?($twit-post $twit-feed $twit-cred) :: sigh options
|
2016-03-31 03:04:27 +03:00
|
|
|
++ app-message
|
2017-11-08 00:05:52 +03:00
|
|
|
$? {{ship $hall} $hall-action action:hall} :: chat message
|
2017-10-24 01:19:57 +03:00
|
|
|
{{ship $hood} $write-plan-account user:eyre plan-acct} :: registration
|
2016-03-31 03:04:27 +03:00
|
|
|
== ::
|
2016-03-07 21:42:05 +03:00
|
|
|
++ sign :: arvo response
|
2016-03-15 03:37:34 +03:00
|
|
|
$% {$e $thou p/httr} :: HTTP result
|
|
|
|
{$t $wake $~} :: timeout ping
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
|
|
|
::
|
2016-03-15 03:37:34 +03:00
|
|
|
:: XX =*
|
2016-03-21 23:35:29 +03:00
|
|
|
++ stat post:twitter :: recieved tweet
|
2016-03-15 04:02:59 +03:00
|
|
|
++ command command:twitter :: incoming command
|
|
|
|
++ endpoint endpoint:reqs:twitter :: outgoing target
|
|
|
|
++ param param:reqs:twitter :: twit-req paramters
|
|
|
|
++ print print:twitter :: their serialization
|
2016-03-15 03:37:34 +03:00
|
|
|
::
|
2016-03-07 21:42:05 +03:00
|
|
|
--
|
2016-11-17 04:42:58 +03:00
|
|
|
::
|
2016-03-07 21:42:05 +03:00
|
|
|
::::
|
|
|
|
::
|
2017-10-24 01:19:57 +03:00
|
|
|
|_ {bowl:gall axle}
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
2016-03-31 03:04:27 +03:00
|
|
|
++ prep
|
2017-10-24 01:19:57 +03:00
|
|
|
|= a/(unit axle) ^- (quip move _+>)
|
2016-03-31 03:04:27 +03:00
|
|
|
?^ a [~ +>(+<+ u.a)]
|
|
|
|
(peer-scry-x /cred)
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
|
|
|
++ cull :: remove seen tweets
|
2016-03-15 03:37:34 +03:00
|
|
|
|= {pax/path rep/(list stat)} ^+ rep
|
2016-03-15 04:02:59 +03:00
|
|
|
=+ pev=(silt (turn (~(get ja fed) pax) |=(stat id)))
|
2016-03-07 21:42:05 +03:00
|
|
|
(skip rep |=(stat (~(has in pev) id)))
|
|
|
|
::
|
|
|
|
++ done [*(list move) .]
|
|
|
|
++ dely :: next polling timeout
|
2016-03-15 03:37:34 +03:00
|
|
|
|= pax/path
|
|
|
|
^- {(unit time) _ran}
|
2016-03-07 21:42:05 +03:00
|
|
|
=+ cur=(~(get by ran) pax)
|
|
|
|
=+ tym=(add now (mul ~s8 (bex ?~(cur 0 p.u.cur))))
|
|
|
|
:: ~& dely/`@dr`(sub tym now)
|
|
|
|
?: &(?=(^ cur) (gte tym q.u.cur) (gth q.u.cur now))
|
|
|
|
[~ ran]
|
|
|
|
[`tym (~(put by ran) pax ?~(cur 0 (min 5 +(p.u.cur))) tym)]
|
|
|
|
::
|
2016-03-19 01:16:47 +03:00
|
|
|
++ wait-new :: poll with min delay
|
|
|
|
|= {pax/path mof/(list move)}
|
|
|
|
(wait(ran (~(del by ran) pax)) pax mof)
|
|
|
|
::
|
2016-03-07 21:42:05 +03:00
|
|
|
++ wait :: ensure poll by path
|
2016-03-17 02:45:09 +03:00
|
|
|
|= {pax/path mof/(list move)} ^+ done
|
2016-03-07 21:42:05 +03:00
|
|
|
=^ tym ran (dely pax)
|
|
|
|
:_ +>.$
|
2017-11-08 00:05:52 +03:00
|
|
|
?~ tym
|
2016-03-07 21:42:05 +03:00
|
|
|
:: ~& no-wait/ran
|
|
|
|
mof
|
|
|
|
:: ~& will-wait/u.tym
|
|
|
|
:- [ost %wait pax u.tym]
|
|
|
|
mof
|
|
|
|
::
|
|
|
|
++ poke-twit-do :: recieve request
|
2017-10-24 01:19:57 +03:00
|
|
|
|= {usr/user:eyre act/command} ^+ done
|
2016-03-07 22:05:37 +03:00
|
|
|
?- -.act
|
2016-03-15 03:37:34 +03:00
|
|
|
$post
|
2016-03-19 01:16:47 +03:00
|
|
|
=. out (~(put by out) p.act %& usr q.act)
|
2016-03-22 23:00:45 +03:00
|
|
|
%+ wait-new /peer/home/[usr]
|
2016-03-24 02:19:56 +03:00
|
|
|
=+ req=[%twit-req `endpoint`update+[%status q.act]~ ~]
|
2017-10-24 01:19:57 +03:00
|
|
|
[ost %hiss post+(dray:wired ~[%uv] p.act) `usr %twit-post req]~
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
|
|
|
::
|
|
|
|
++ wake-peer
|
2016-03-15 03:37:34 +03:00
|
|
|
|= {pax/path $~} ^+ done
|
|
|
|
~& twit-wake+peer+pax
|
2016-03-07 21:42:05 +03:00
|
|
|
:_ +>.$
|
2016-03-15 03:37:34 +03:00
|
|
|
?. (~(has by ran) peer+pax) :: ignore if retracted
|
2016-03-07 21:42:05 +03:00
|
|
|
~
|
2016-03-15 03:37:34 +03:00
|
|
|
=+ => |=({a/bone @ b/path} [b a])
|
2017-02-13 23:43:18 +03:00
|
|
|
pus=(~(gas ju *(jug path bone)) (turn ~(tap by sup) .))
|
2016-03-07 21:42:05 +03:00
|
|
|
?~ (~(get ju pus) pax)
|
|
|
|
~
|
2017-11-08 00:05:52 +03:00
|
|
|
~& peer-again+[pax ran]
|
2016-03-17 02:41:19 +03:00
|
|
|
(pear | `~. pax) ::(user-from-path pax))
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
2016-03-23 02:10:16 +03:00
|
|
|
++ sigh-recoverable-error :: Rate-limit
|
|
|
|
|= {pax/path $429 $rate-limit lim/(unit @da)}
|
|
|
|
=. ran (~(put by ran) pax 6 now)
|
|
|
|
=+ tym=?~(lim (add ~m7.s30 now) (add ~1970.1.1 (mul ~s1 u.lim)))
|
|
|
|
~& retrying-in+`@dr`(sub tym now)
|
|
|
|
:_(+>.$ [ost %wait pax tym]~)
|
2016-03-15 01:18:22 +03:00
|
|
|
::
|
2016-03-31 03:02:52 +03:00
|
|
|
++ sigh-twit-cred-scry-cred sigh-twit-cred-cred :: alias
|
|
|
|
++ sigh-twit-cred-cred
|
|
|
|
|= {wir/wire acc/plan-acct raw/json} ^+ done
|
|
|
|
?> ?=($~ wir)
|
|
|
|
=+ pax=`twit-path`cred+wir
|
|
|
|
:_ +>.$(ced `[now raw])
|
2016-03-31 03:04:27 +03:00
|
|
|
:- [ost %poke pax [our %hood] %write-plan-account ~.twitter acc]
|
2016-03-31 03:02:52 +03:00
|
|
|
(spam-with-scry-x pax json+raw)
|
|
|
|
::
|
2016-03-21 23:35:29 +03:00
|
|
|
++ sigh-twit-post-post :: status acknowledged
|
2016-03-15 03:37:34 +03:00
|
|
|
|= {wir/wire rep/stat} ^+ done
|
2017-10-24 01:19:57 +03:00
|
|
|
=+ (raid:wired wir mez=%uv ~)
|
2016-03-15 03:37:34 +03:00
|
|
|
=. out (~(put by out) mez %| rep)
|
2016-03-15 01:18:22 +03:00
|
|
|
:_ +>.$
|
|
|
|
=+ pax=/[who.rep]/status/(rsh 3 2 (scot %ui id.rep))
|
2016-03-15 03:37:34 +03:00
|
|
|
:- (show-url [& ~ &+/com/twitter] `pax ~)
|
2016-03-31 03:02:52 +03:00
|
|
|
(spam-with-scry-x post+wir twit-post+rep)
|
2016-03-15 01:18:22 +03:00
|
|
|
::
|
2016-03-17 02:45:09 +03:00
|
|
|
++ sigh-twit-feed :: feed data
|
|
|
|
|= {wir/wire rep/(list stat)} ^+ done
|
|
|
|
?> ?=({?($peer $scry) *} wir)
|
|
|
|
=* pax t.wir
|
2016-03-15 03:37:34 +03:00
|
|
|
:: ~& got-feed+[(scag 5 (turn rep |=(stat id))) fed]
|
2016-03-17 03:20:29 +03:00
|
|
|
=+ ren=(cull pax rep) :: new messages
|
|
|
|
=. rep (weld ren (~(get ja fed) pax))
|
2016-03-19 01:16:47 +03:00
|
|
|
=. fed (~(put by fed) pax rep) :: save full list
|
2016-03-17 02:45:09 +03:00
|
|
|
?: ?=($scry -.wir)
|
|
|
|
[(spam scry+x+pax [%diff twit-feed+(flop rep)] [%quit ~] ~) +>.$]
|
2016-03-15 01:18:22 +03:00
|
|
|
?~ ren
|
2016-03-17 02:45:09 +03:00
|
|
|
(wait wir ~) :: pump polling
|
2016-03-15 03:37:34 +03:00
|
|
|
:: ~& spam-feed+ren
|
2016-03-19 01:16:47 +03:00
|
|
|
(wait-new wir (spam pax [%diff twit-feed+(flop ren)] ~))
|
2016-03-17 02:45:09 +03:00
|
|
|
::
|
|
|
|
++ sigh-tang :: Err
|
|
|
|
|= {pax/path tan/tang} ^+ done
|
2016-03-17 03:20:29 +03:00
|
|
|
~& sigh-tang+pax
|
|
|
|
%- (slog (flop tan))
|
2016-03-15 03:37:34 +03:00
|
|
|
=+ ^- git/gift
|
2016-12-03 02:09:58 +03:00
|
|
|
=+ err='' ::%.(q:(need r.hit) ;~(biff de-json mean:reparse:twitter)) :: XX parse?
|
2016-03-15 01:18:22 +03:00
|
|
|
:^ %diff %ares %bad-http
|
2016-03-15 03:37:34 +03:00
|
|
|
tan
|
|
|
|
:: [leaf/"HTTP Code {<p.hit>}" (turn (need err) mean:render:twit)]
|
2016-03-15 01:18:22 +03:00
|
|
|
?+ pax [[ost git]~ +>.$]
|
2016-03-15 03:37:34 +03:00
|
|
|
{$post @ $~}
|
2016-03-15 01:18:22 +03:00
|
|
|
[(spam pax git ~) +>.$]
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
2016-03-17 02:45:09 +03:00
|
|
|
::
|
|
|
|
:: ++ user-to-path |=(a/(unit iden) ?~(a '~' (scot %ta u.a)))
|
|
|
|
:: ++ user-from-path
|
|
|
|
:: |= pax/path ^- {(unit iden) path}
|
|
|
|
:: ~| %bad-user
|
|
|
|
:: ?~ pax ~|(%empty-path !!)
|
|
|
|
:: ~| i.pax
|
|
|
|
:: ?: =('~' i.pax) [~ t.pax]
|
|
|
|
:: [`(slav %ta i.pax) t.pax]
|
|
|
|
::
|
|
|
|
::
|
2017-10-24 01:19:57 +03:00
|
|
|
++ compat
|
|
|
|
|= {usr/(unit user:eyre) req/(unit user:eyre)}
|
|
|
|
?~(req & =(usr req))
|
2016-03-22 23:00:45 +03:00
|
|
|
::
|
|
|
|
:: .^(twit-feed %gx /=twit=/~/home/urbit_test)
|
2016-03-17 02:45:09 +03:00
|
|
|
:: .^(twit-stat %gx /=twit=/~./post/0vv0old.0post.hash0.0000)
|
|
|
|
++ peek
|
2017-10-24 01:19:57 +03:00
|
|
|
|= {ren/care:clay pax/path} ^- (unit (unit gilt))
|
2016-03-17 02:45:09 +03:00
|
|
|
?> ?=($x ren) :: others unsupported
|
|
|
|
=+ usr=`~. :: =^ usr pax (user-from-path pax)
|
|
|
|
?. ?=(twit-path pax)
|
|
|
|
~|([%missed-path pax] !!)
|
|
|
|
=+ gil=(pear-scry pax)
|
|
|
|
?- -.gil
|
|
|
|
$none ~
|
|
|
|
$part ~ :: stale data
|
|
|
|
$full ``p.gil
|
|
|
|
==
|
|
|
|
::
|
|
|
|
++ peer-scry-x
|
|
|
|
|= pax/path ^+ done
|
|
|
|
:_ +>
|
|
|
|
=+ pek=(peek %x pax)
|
|
|
|
?^ pek
|
|
|
|
?~ u.pek ~|(bad-scry+x+pax !!)
|
|
|
|
~[[ost %diff u.u.pek] [ost %quit ~]]
|
|
|
|
=+ usr=`~. :: =^ usr pax (user-from-path pax)
|
|
|
|
?. ?=(twit-path pax)
|
|
|
|
~|([%missed-path pax] !!)
|
|
|
|
=+ hiz=(pear-hiss pax)
|
|
|
|
?~ hiz ~ :: already in flight
|
2016-03-22 23:00:45 +03:00
|
|
|
::?> (compat usr -.u.hiz) :: XX better auth
|
2017-11-08 00:05:52 +03:00
|
|
|
[ost %hiss scry+pax usr +.u.hiz]~
|
2016-03-17 02:45:09 +03:00
|
|
|
::
|
|
|
|
++ peer |=(pax/path :_(+> (pear & `~. pax))) :: accept subscription
|
2016-03-07 21:42:05 +03:00
|
|
|
++ pear :: poll, possibly returning current data
|
2017-10-24 01:19:57 +03:00
|
|
|
|= {ver/? usr/(unit user:eyre) pax/path}
|
2016-03-07 21:42:05 +03:00
|
|
|
^- (list move)
|
|
|
|
?. ?=(twit-path pax)
|
|
|
|
~|([%missed-path pax] !!)
|
2016-03-17 02:45:09 +03:00
|
|
|
=+ gil=(pear-scry pax)
|
|
|
|
%+ welp
|
|
|
|
^- (list move)
|
|
|
|
?: ?=($full -.gil) ~ :: permanent result
|
|
|
|
=+ hiz=(pear-hiss pax)
|
|
|
|
?~ hiz ~
|
2016-03-22 23:00:45 +03:00
|
|
|
::?> (compat usr -.u.hiz) :: XX better auth
|
|
|
|
[ost %hiss peer+pax usr +.u.hiz]~
|
2016-03-17 02:45:09 +03:00
|
|
|
^- (list move)
|
|
|
|
?. ver ~
|
|
|
|
?- -.gil
|
|
|
|
$none ~
|
|
|
|
$part [ost %diff p.gil]~
|
|
|
|
$full ~[[ost %diff p.gil] [ost %quit ~]]
|
|
|
|
==
|
|
|
|
::
|
|
|
|
++ pear-scry
|
|
|
|
|= pax/twit-path ^- $%({$none $~} {$part p/gilt} {$full p/gilt})
|
2016-03-07 21:42:05 +03:00
|
|
|
?- -.pax
|
2016-03-17 02:45:09 +03:00
|
|
|
$post
|
2017-10-24 01:19:57 +03:00
|
|
|
=+ (raid:wired +.pax mez=%uv ~)
|
2016-03-15 03:37:34 +03:00
|
|
|
=+ sta=(~(get by out) mez)
|
2016-03-17 02:45:09 +03:00
|
|
|
?. ?=({$~ $| *} sta)
|
|
|
|
[%none ~]
|
2016-03-21 23:35:29 +03:00
|
|
|
[%full twit-post+p.u.sta]
|
2016-03-17 02:45:09 +03:00
|
|
|
::
|
2016-03-22 23:00:45 +03:00
|
|
|
?($user $home)
|
2016-03-17 02:45:09 +03:00
|
|
|
[%part twit-feed+(flop (~(get ja fed) pax))]
|
2016-03-31 03:02:52 +03:00
|
|
|
::
|
|
|
|
$cred
|
|
|
|
?~ ced [%none ~]
|
|
|
|
?: (gth now (add p.u.ced ~m1)) :: stale
|
|
|
|
[%none ~]
|
|
|
|
[%full %json q.u.ced]
|
2016-03-17 02:45:09 +03:00
|
|
|
==
|
|
|
|
::
|
|
|
|
++ pear-hiss
|
2017-10-24 01:19:57 +03:00
|
|
|
|= pax/twit-path ^- (unit {(unit user:eyre) api-call})
|
2016-03-07 21:42:05 +03:00
|
|
|
?- -.pax
|
2016-03-17 02:45:09 +03:00
|
|
|
$post ~ :: future/unacked
|
2016-03-31 03:02:52 +03:00
|
|
|
$cred
|
|
|
|
`[`~. %twit-cred twit-req+[test-login+~ ['skip_status'^%t]~]]
|
|
|
|
::
|
2016-03-22 23:00:45 +03:00
|
|
|
$user
|
|
|
|
=+ ole=(~(get ja fed) pax)
|
|
|
|
=+ opt=?~(ole ~ ['since_id' (tid:print id.i.ole)]~)
|
2016-03-24 02:19:56 +03:00
|
|
|
`[`~. [%twit-feed twit-req+[posts-by+[(to-sd p.pax)]~ opt]]]
|
2016-03-22 23:00:45 +03:00
|
|
|
::
|
2016-03-22 21:49:04 +03:00
|
|
|
$home
|
|
|
|
=+ ole=(~(get ja fed) pax)
|
|
|
|
=+ opt=?~(ole ~ ['since_id' (tid:print id.i.ole)]~)
|
2016-03-24 02:19:56 +03:00
|
|
|
`[`p.pax [%twit-feed twit-req+[timeline+~ opt]]]
|
2016-03-07 21:42:05 +03:00
|
|
|
==
|
|
|
|
::
|
|
|
|
++ to-sd :: parse user name/numb
|
2016-03-15 03:37:34 +03:00
|
|
|
|= a/knot ^- sd:param
|
2016-03-07 21:42:05 +03:00
|
|
|
~| [%not-user a]
|
|
|
|
%+ rash a
|
2017-10-24 01:19:57 +03:00
|
|
|
;~(pose (stag %user-id dem) (stag %screen-name user:parse:twitter))
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
|
|
|
:: ++ pull :: release subscription
|
2016-03-15 03:37:34 +03:00
|
|
|
:: |= ost/bone
|
2016-03-07 21:42:05 +03:00
|
|
|
:: ?. (~(has by sup) ost) `+>.$ :: XX should not occur
|
|
|
|
:: =+ [his pax]=(~(got by sup) ost)
|
|
|
|
:: ?: (lth 1 ~(wyt in (~(get ju pus) pax)))
|
|
|
|
:: `+>.$
|
|
|
|
:: =: ran (~(del by ran) [%peer pax])
|
|
|
|
:: fed (~(del by fed) pax)
|
|
|
|
:: ==
|
|
|
|
:: `+>.$
|
|
|
|
::
|
2016-03-31 03:02:52 +03:00
|
|
|
++ spam-with-scry-x :: recieve final
|
|
|
|
|= {a/path b/gilt} ^- (list move)
|
|
|
|
=+ mof=~[[%diff b] [%quit ~]]
|
|
|
|
(weld (spam a mof) (spam scry+x+a mof))
|
|
|
|
::
|
2016-03-07 21:42:05 +03:00
|
|
|
++ spam :: send by path
|
2016-03-15 03:37:34 +03:00
|
|
|
|= {a/path b/(list gift)} ^- (list move)
|
2016-03-07 21:42:05 +03:00
|
|
|
%- zing ^- (list (list move))
|
2017-02-13 23:43:18 +03:00
|
|
|
%+ turn ~(tap by sup)
|
2016-03-15 03:37:34 +03:00
|
|
|
|= {ost/bone @ pax/path}
|
2016-03-07 21:42:05 +03:00
|
|
|
?. =(pax a) ~
|
2016-03-15 03:37:34 +03:00
|
|
|
(turn b |=(c/gift [ost c]))
|
2016-03-07 21:42:05 +03:00
|
|
|
::
|
2017-11-08 00:05:52 +03:00
|
|
|
++ show-url ~(said-url hall `bowl:gall`+<-)
|
2016-03-07 21:42:05 +03:00
|
|
|
--
|