diff options
author | polwex <polwex@sortug.com> | 2025-06-27 22:53:52 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-06-27 22:53:52 +0700 |
commit | 328ebe85135912678bdacd3381126ffd66ef2761 (patch) | |
tree | 365962bf45302f2a440f766a4f3c9e0a962dbe47 /desk/lib |
init
Diffstat (limited to 'desk/lib')
38 files changed, 27746 insertions, 0 deletions
diff --git a/desk/lib/boke.hoon b/desk/lib/boke.hoon new file mode 100644 index 0000000..aecfabb --- /dev/null +++ b/desk/lib/boke.hoon @@ -0,0 +1,207 @@ +/- *boke, tp=trill-post, c=tlon-channels +/+ sr=sortug, kaji, sigil=sigil-sigil, plib=trill-utils, ui=trill-ui, const=constants, kaji, cjk, wall +|% +:: state data structures +++ get-name +|= p=@p ^- tape +?: (lth p (bex 64)) + ?: (is-admin p) "Spandrell" + (scow %p p) +=/ oldie (sub p (bex 64)) +?: ((sane %t) oldie) (trip oldie) +"anon" + + + :: +++ tags-by-size +|= [tt=tags-table who=@p] ^- (list [@t count=@ud]) + =/ wal ~(. wall who) + =/ l %+ roll ~(tap by tt) |= [[tag=@t p=pidmap] acc=(list [@t @ud])] + ?. (tag-filter:wal tag) acc :_ acc + :- tag (wyt:porm:tp p) + %+ sort l |= [a=[tag=@t c=@ud] b=[tag=@t c=@ud]] + (gte c.a c.b) + +++ tags-by-date +|= [tt=tags-table who=@p] ^- (list [@t pidmap]) + =/ wal ~(. wall who) + =/ l %+ skim ~(tap by tt) |= [tag=@t *] (tag-filter:wal tag) + %+ sort l |= $: + a=[tag=@t pids=pidmap] + b=[tag=@t pids=pidmap] == + =/ first-a (pry:porm:tp pids.a) + =/ first-b (pry:porm:tp pids.b) + ?~ first-a .n + ?~ first-b .y + =/ id-a=@da +>.u.first-a + =/ id-b=@da +>.u.first-b + (gth id-a id-b) + + +++ is-admin +|= p=@p ^- ? +?| .=(p ~docteg-mothep) + .=((^sein:title p) ~docteg-mothep) +== +++ is-subscribed +|= p=@p ^- ? +?| (is-admin p) + (~(has in subscribers:const) p) +== +++ is-blog +|= t=thread:tp ^- ? + (~(has in tags.t) 'blog') +:: +++ get-path +|= [pat=path blog-view=? is-blog=?] ^- path +?: is-blog + ?: blog-view pat (weld /board/blog pat) + ?: blog-view (weld /blog/b pat) (weld /board pat) + +++ board-path +|= =thread:tp ^- path + ?. (is-blog thread) (weld /board path.thread) + (weld /board/blog path.thread) +++ blog-path +|= =thread:tp ^- path + ?: (is-blog thread) path.thread + (weld /blog/b path.thread) + +++ naive-board-path +|= [title=@t tags=(set @t)] ^- [@t @t] + =/ boards ~(key by categories:const) + =/ int (~(int in tags) boards) + =/ lint ~(tap in int) + =/ first-tag ?~ lint 'public' i.lint + =/ kebab (crip (enkebab3:string:sr title)) + [first-tag kebab] + +++ find-board-path +|= [pm=pathmap =post:tp] ^- tape + =/ max 5 + =/ [tag=@t kebab=@t] (naive-board-path title.post tags.post) + =/ pat=path [tag kebab ~] + =/ ok=? + =/ has (~(get by pm) pat) ?~ has .n + .=(u.has [author.post id.post]) + ?: ok (trip kebab) + =/ num 2 + |- + ?: .=(num max) "esc/{(enc:kaji [author.post id.post])}" + ~& incrementing-find-board-path=[title.post num] + =/ nclean (enkebab2:string:sr (cat 3 title.post (cat 3 '-' (scot %ud num)))) + =/ npat=path ~[(crip nclean)] + =/ ok=? + =/ has (~(get by pm) npat) ?~ has .n + .=(u.has [author.post id.post]) + ?: ok nclean + $(num +(num)) + +++ make-board-path +|= [pm=pathmap title=@t tags=(set @t)] ^- path + =/ [tag=@t kebab=@t] (naive-board-path title tags) + =/ pat=path [tag kebab ~] + =/ has (~(get by pm) pat) + ?~ has pat + =/ num 2 + |- + =/ nkebab (cat 3 kebab (cat 3 '-' (scot %ud num))) + =/ npat=path [tag nkebab ~] + =/ has (~(get by pm) npat) + ?~ has npat + $(num +(num)) + +:: ++ board-path +:: |= =post:tp ^- tape +:: =/ uid (scow:parsing:sr %uw (jam [author.post id.post])) +:: =/ title (enkebab2:string:sr title.post) +:: "{uid}--{title}" +++ title-to-path + |= [title=@t date=@da] ^- path + =/ pat1 (date-to-path:string:sr date) + =/ pat2 (enpath:string:sr title) + =/ pat-string %^ foldi:sr pat2 '' |= [i=@ud it=@t acc=@t] + =/ s=@t ?: .=(i (dec (lent pat2))) it + (rap 3 ~[it '-']) + =/ a=(list @t) ~[acc s] + (rap 3 a) + (weld pat1 ~[pat-string]) + +++ make-blogpost-path + |= [tim=@da t=@t] ^- path + =/ dat=path (date-to-path:string:sr tim) + (snoc dat (crip (enkebab2:string:sr t))) +:: +++ edit-post + |= [p=post:tp ncontents=content-list:tp tags=(set @t) now=@da] + ^- post:tp + =/ contents (put:corm:tp contents.p now ncontents) + %= p + contents contents + tags tags + == +++ build-thread +|= [title=@t =post:tp paths=pathmap is-blog=?] ^- thread:tp + =/ pat ?: is-blog + (make-blogpost-path id.post title) + (make-board-path paths title tags.post) + =/ snip-size ?: is-blog 500 200 + =/ snip (abbreviate-post:plib contents.post snip-size) + =| t=thread:tp + %= t + pid [author.post id.post] + title title + path pat + tags tags.post + snip snip + == +++ build-post + |= [contents=content-list:tp tags=(set @t) =pid:tp] + ^- post:tp + =/ contents (gas:corm:tp *content-map:tp [id.pid contents]~) + =/ p *post:tp + %= p + id id.pid + thread pid + author ship.pid + contents contents + tags tags + == +++ set-parents + |= [p=post:tp thread=pid:tp parent=pid:tp] + %= p + parent (some parent) + thread thread + == +++ random-avatar +|= hash=@ ^- tape +=/ top (dec (lent soyjaks:const)) +=/ ind (mod hash top) +=/ file (snag ind soyjaks:const) +"{s3.const}/soyjaks/{file}" + +++ is-anon +|= p=@p ^- ? +?= %pawn (clan:title p) +:: Fetch posts by tag or board + +++ post-date-ago +|= [d=@da now=@da length=?(%tam %yau)] ^- tape +=/ diff=@dr (sub now d) +?: (lth diff ~m1) %+ weld (scow:parsing:sr %ud (div diff ~s1)) +?: ?=(%tam length) "m" " seconds" +?: (lth diff ~h1) %+ weld (scow:parsing:sr %ud (div diff ~m1)) +?: ?=(%tam length) "m" " minutes" +?: (lth diff ~d1) %+ weld (scow:parsing:sr %ud (div diff ~h1)) +?: ?=(%tam length) "h" " hours" +?: (lth diff ~d30) %+ weld (scow:parsing:sr %ud (div diff ~d1)) +?: ?=(%tam length) "d" " days" +?: (lth diff ~d365) %+ weld (scow:parsing:sr %ud (div diff ~d30)) +?: ?=(%tam length) "mo" " months" + %+ weld (scow:parsing:sr %ud (div diff ~d365)) +?: ?=(%tam length) "y" " years" +++ last-reply +|= p=full-node:tp ^- (unit pid:tp) + =/ pry (pry:form:tp children.p) + ?~ pry ~ `key.u.pry +-- diff --git a/desk/lib/chat.hoon b/desk/lib/chat.hoon new file mode 100644 index 0000000..9390c35 --- /dev/null +++ b/desk/lib/chat.hoon @@ -0,0 +1,88 @@ +/- chat +|% ++$ eyre-id @ta ++$ card card:agent:gall +:: cards +++ watch-chat + |= [our=ship =term] + ^- card + :* %pass + /listen/[term] + %agent + [our %chat] + %watch + /chat/(scot %p our)/[term]/ui/writs + == +++ leave-chat + |= [our=ship =term] + ^- card + [%pass /listen/[term] %agent [our %chat] %leave ~] +++ handle-msg + |= [=wire =sign:agent:gall] + ^- (quip card _this) + ?. ?=(%fact -.sign) `this + =* mark p.cage.sign + =* vase q.cage.sign + ?. ?=(%writ-diff p.cage.sign) `this + =^ cards state + (handle-chat-update:do source !<(diff:writs:chat vase)) + [cards this] + == +== +++ handle-chat-update +|= =diff:writs:chat ^- (list card) +:: TODO other stuff +?. ?=(%add -.q.diff) `this +(send-to-viewers p.q.diff) +++ send-to-viewers +|= =memo:chat +=/ ids=(set eyre-id) (sy ~['lol']) +:_ ~ +:* %give + %fact + :: + %+ turn ~(tap in ids) + |= =eyre-id + /http-response/[eyre-id] + :: + %http-response-data + !> ^- (unit octs) + %- some + (make-stream-data (scot %uw (jam memo))) +== ++$ channel-event + $% $>(%poke-ack sign:agent:gall) + $>(%watch-ack sign:agent:gall) + $>(%kick sign:agent:gall) + [%fact =desk =mark =noun] + == +++ channel-event-to-tape +|= [request-id=@ud =channel-event] +=+ [request-id channel-event] +(scow %uw (jam -)) +++ make-stream-data + |= =cord + ^- octs + %- as-octs:mimes:html + (rap 3 'data:' cord '\0a\0a' ~) + +:: user management + +:: ++ ban-comet +:: |= who=ship +:: ^- (quip card _state) +:: :- ~ +:: %_ state +:: guests (~(del by guests) who) +:: banned (~(uni in banned) (~(get ju guests) who)) +:: == +:: :: +:: ++ unban-ip +:: |= =address:eyre +:: ^- (quip card _state) +:: :- ~ +:: %_ state +:: banned (~(del in banned) address.action) +:: == + +--
\ No newline at end of file diff --git a/desk/lib/cjk.hoon b/desk/lib/cjk.hoon new file mode 100644 index 0000000..2d34896 --- /dev/null +++ b/desk/lib/cjk.hoon @@ -0,0 +1,107 @@ +/+ sr=sortug +/* raw %json /data/unihan/json +|% +++ generic +|= jon=json + =, dejs:format + ?: ?=(%n -.jon) (ni jon) + ?: ?=(%s -.jon) (so jon) + ?: ?=(%o -.jon) ((om generic) jon) + ?: ?=(%a -.jon) ((ar generic) jon) :: only question here is whether to do ar or as + '' +++ dejs +=, dejs:format + %- om |= jon=json + ?. ?=(%o -.jon) !! :: mmm + (~(run by p.jon) generic) + :: ?: .= k 'kAccountingNumeric' (ni v) + :: ?: .= k 'kGB0' (ni v) + :: ?: .= k 'kGB1' (ni v) + :: ?: .= k 'kGradeLevel' (ni v) + :: ?: .= k 'kFrequency' (so v) + :: ?: .= k 'kBigFive' (so v) + :: ?: .= k 'kCCCII' (so v) + :: ?: .= k 'kCNS1986' (so v) + :: ?: .= k 'kCNS1992' (so v) + :: ?: .= k 'kCangjie' (so v) + :: ?: .= k 'kCowles' (so v) + :: ?: .= k 'kDaeJaweon' (so v) + :: ?: .= k 'kDefinition' (so v) + :: ?: .= k 'kEACC' (so v) + :: ?: .= k 'kFenn' (so v) + :: ?: .= k 'kFennIndex' (so v) + :: ?: .= k 'kFourCornerCode' (so v) + :: ?: .= k 'kHKGlyph' (so v) + :: ?: .= k 'kHanYu' (so v) + :: ?: .= k 'kIICore' (so v) + :: ?: .= k 'kIRGDaeJaweon' (so v) + :: ?: .= k 'kIRGDaiKanwaZiten' (so v) + :: ?: .= k 'kIRGHanyuDaZidian' (so v) + :: ?: .= k 'kIRGKangXi' (so v) + :: ?: .= k 'kIRG_GSource' (so v) + :: ?: .= k 'kIRG_HSource' (so v) + :: ?: .= k 'kIRG_JSource' (so v) + :: ?: .= k 'kIRG_KPSource' (so v) + :: ?: .= k 'kIRG_KSource' (so v) + :: ?: .= k 'kIRG_TSource' (so v) + :: ?: .= k 'kJis0' (so v) + :: ?: .= k 'kKPS0' (so v) + :: ?: .= k 'kKSC0' (so v) + :: ?: .= k 'kKangXi' (so v) + :: ?: .= k 'kKorean' (so v) + :: ?: .= k 'kKoreanName' (so v) + :: ?: .= k 'kMainlandTelegraph' (so v) + :: ?: .= k 'kMandarin' (so v) + :: ?: .= k 'kMatthews' (so v) + :: ?: .= k 'kMeyerWempe' (so v) + :: ?: .= k 'kMorohashi' (so v) + :: ?: .= k 'kPhonetic' (so v) + :: ?: .= k 'kRSAdobe_Japan1_6' (so v) + :: ?: .= k 'kRSKangXi' (so v) + :: ?: .= k 'kRSUnicode' (so v) + :: ?: .= k 'kSBGY' (so v) + :: ?: .= k 'kSemanticVariant' (so v) + :: ?: .= k 'kSpecializedSemanticVariant' (so v) + :: ?: .= k 'kTGH' (so v) + :: ?: .= k 'kXHC1983' (so v) + :: ?: .= k 'kXerox' (so v) + :: ?: .= k 'kZVariant' (so v) + :: ?: .= k 'kCantonese' ((as so) v) + :: ?: .= k 'kHangul' ((om so) v) + :: ?: .= k 'kHanyuPinyin' ((om (as so)) v) + :: ?: .= k 'kJapaneseKun' ((as so) v) + :: ?: .= k 'kJapaneseOn' ((as so) v) + :: ?: .= k 'kLau' ((as ni) v) + :: ?: .= k 'kNelson' ((as ni) v) + :: ?: .= k 'kTaiwanTelegraph' ((as ni) v) + :: ?: .= k 'kTotalStrokes' ((as ni) v) '' +++ get-map + (dejs raw) +++ is-cjk +|= char=@t ^- ? + =/ start 0x4e00 + =/ end 0x9fff + =/ codepoint (taft char) + ?& (gte codepoint start) (lte codepoint end) == + +++ has +|= t=tape ^- ? + |- + ?~ t .n + ?: .=(3 (met 3 i.t)) .y + $(t t.t) +++ romanize +|= t=@t ^- tape + =/ dict get-map + =/ size (div (met 3 t) 3) + =/ l (rip [3 size] t) + |- + ?~ l ~ + =/ data (~(get by dict) i.l) + ?~ data $(l t.l) + =/ mand (~(get by u.data) 'kMandarin') + ?~ mand $(l t.l) + =/ cord ((soft @t) u.mand) + ?~ cord $(l t.l) + :- u.cord $(l t.l) +-- diff --git a/desk/lib/constants.hoon b/desk/lib/constants.hoon new file mode 100644 index 0000000..ecadba9 --- /dev/null +++ b/desk/lib/constants.hoon @@ -0,0 +1,164 @@ +|% +++ board-page-size 20 +++ thread-page-size 20 +++ search-page-size 30 +++ blog-page-size 20 +++ tianming-users ^- (list @p) +:~ ~locpyl-tidnyd + ~torwes-minput + ~bacrul-ridbes +== +++ subscribers ^- (set @p) +%- silt +:~ ~polwex +== + +++ vip +:~ ~docteg-mothep + ~polwex + ~locpyl-tidnyd + ~wispem-wantex + ~sorwet + ~tiller-tolbus +== +++ categories +^- (map term (set cord)) +%- malt ^- (list [term (set cord)]) :~ +:- %theory +%- silt ~['theory' 'philosophy' 'deep'] +:- %orient +%- silt ~['orient' 'china' 'japan' 'korea' 'vietnam' 'thailand'] +:- %politics +%- silt ~['politics' 'pol'] +:- %food +%- silt ~['food' 'cooking' 'recipes' 'eating' 'restaurants'] +:- %business +%- silt ~['business' 'entrepreneurship' 'hustle'] +:- %money +%- silt ~['money' 'banking' 'finance' 'stocks' 'investment' 'bonds'] +:- %crypto +%- silt ~['crypto' 'bitcoin' 'ethereum' 'eth' 'btc'] +:- %travel +%- silt ~['travel' 'trips' 'abroad'] +:- %health +%- silt ~['health' 'medicine' 'pharma'] +:- %family +%- silt ~['family' 'kids' 'childcare' 'education'] +:- %music +%- silt ~['music'] +:- %film +%- silt ~['film' 'movies' 'tv' 'shows'] +:- %books +%- silt ~['books' 'literature' 'fiction' 'non-fiction'] +:- %religion +%- silt ~['religion' 'god' 'faith'] +:- %gmi +%- silt ~['gmi' 'nice' 'whitepill' 'cozy'] +:- %ngmi +%- silt ~['ngmi' 'cringe' 'libs' 'blackpill'] +:- %physiognomy +%- silt ~['physiognomy' 'hbd' 'ethnic' 'anthropology' 'genetics'] +:- %tech +%- silt ~['tech' 'technology'] +:- %science +%- silt ~['science' 'chemistry' 'physics'] +:- %computing +%- silt ~['computing' 'computers' 'programming' 'coding'] +:- %ai +%- silt ~['ai' 'openai' 'gpt' 'ml' 'llm' 'image-generation' 'midjourney'] +:- %urbit +%- silt ~['urbit' 'tlon' 'sortug'] +:- %art +%- silt ~['art' 'arts' 'beauty' 'beautiful'] +:- %humor +%- silt ~['humor' 'funny' 'jokes'] +:- %links +%- silt ~['links'] +:- %sex +%- silt ~['sex' 'women' 'wahmen' 'dating'] +:- %history +%- silt ~['history'] +:- %war +%- silt ~['war' 'military' 'army' 'battle'] +:- %wyb +%- silt ~['wyb'] +:- %vip +%- silt ~['oldtianming' 'vip'] +:- %public ~ +:: :- %oldtianming ~ +== +++ s3 +"https://s3.spandrell.ch/assets" +++ avatars ^- (list tape) +:~ +"Affirmative-Fed-Boi-Chad.png" +"Bashar-Al-Assad-Chad.png" +"Buddhist-Chad.png" +"Chad-No-Nut.png" +"chad.png" +"Crusade-Chad.png" +"Frenchman-Chad.png" +"German-Soldier-Chad.png" +"gigachad.png" +"Hitler-Chad.png" +"Hype-Beast-Chad.png" +"Jew-Chad.png" +"Joker-Chad.png" +"King-Harkinian-Chad.png" +"Military-Chad.png" +"NazBol-Chad.png" +"Nordic-Chad-No-Beard-Black-HEadset.png" +"Portugeuse-Chad.png" +"Red-Headed-Gamer-Chad.png" +"Saudi-Arabian-Chad.png" +"Suited-Chad.png" +"Trump-Chad.png" +"wojak-cry.jpeg" +== +++ soyjaks ^- (list tape) +:~ +"addict.png" +"adulterer.png" +"billions.png" +"bloomer.png" +"chudcry.jpeg" +"chudjak.png" +"chudsmile.png" +"coomer.png" +"crychud.png" +"cuck.png" +"eunuch.png" +"fatjak.png" +"friendzoned.png" +"furry.png" +"gay.png" +"griller.png" +"grinsoy.jpg" +"groomer.png" +"grooomer.png" +"husband.png" +"improover.png" +"incel.png" +"mouthjak.png" +"normal.png" +"partner.png" +"paypig.png" +"pervert.png" +"polygamist.png" +"pua.png" +"pussyhound.png" +"redditjak.png" +"smartjak.jpeg" +"soyjak.png" +"sugardaddy.png" +"tranny.png" +"troon.png" +"twink.png" +"volcel.png" +"weeb.png" +== +++ banned-ships ^- (set @p) +~ +++ banned-ips ^- (set address:eyre) +~ +-- diff --git a/desk/lib/cram.hoon b/desk/lib/cram.hoon new file mode 100644 index 0000000..9081fae --- /dev/null +++ b/desk/lib/cram.hoon @@ -0,0 +1,62 @@ +|% +++ static :: freeze .mdh hoon subset + |= gen=hoon ^- [inf=(map term dime) elm=manx] + ?+ -.gen + =/ gen ~(open ap gen) + ~& >> gen=gen + ?: =(gen ^gen) ~|([%cram-dynamic -.gen] !!) + $(gen gen) + :: + %xray [~ (single (shut gen))] + ^ [(malt (frontmatter p.gen)) (single (shut q.gen))] + == +:: +++ single :: unwrap one-elem marl + |= xml=marl ^- manx + ?: ?=([* ~] xml) i.xml + ~|(%many-elems !!) +:: +++ shut-mart :: xml attrs + |=([n=mane v=(list beer:hoot)] [n (turn v |=(a=beer:hoot ?^(a !! a)))]) +:: +++ shut :: as xml constant + |= gen=hoon ^- marl + ?+ -.gen ~|([%bad-xml -.gen] !!) + %dbug $(gen q.gen) + :: + %xray + [[n.g.p.gen (turn a.g.p.gen shut-mart)] $(gen [%mcts c.p.gen])]~ + :: + %mcts + ?~ p.gen ~ + =- (weld - $(p.gen t.p.gen)) + ?^ -.i.p.gen $(gen [%xray i.p.gen]) + ~| [%shut-tuna -.i.p.gen] + ?+ -.i.p.gen !! + %manx ?>(?=(%xray -.p.i.p.gen) $(gen p.i.p.gen)) + %marl ?>(?=(%mcts -.p.i.p.gen) $(gen p.i.p.gen)) + == + == +:: +:: +++ frontmatter :: parse ~[[%foo 1] [%bar ~s2]] + |= gen=hoon ^- (list [term dime]) + ?: ?=([%bust %null] gen) ~ + ?: ?=(%dbug -.gen) $(gen q.gen) + ?. ?=(%clsg -.gen) ~|([%bad-frontmatter -.gen] !!) + %+ turn p.gen + |= gen=hoon + ?. ?=(^ -.gen) + =/ gen ~(open ap gen) + ?: =(gen ^gen) ~|([%bad-frontmatter-elem -.gen] !!) + $(gen gen) + =/ hed (as-dime p.gen) + ?. =(%tas p.hed) ~|([%bad-frontmatter-key-type p.hed] !!) + [q.hed (as-dime q.gen)] +:: +++ as-dime :: %foo ~.foo 0vbar etc + |= gen=hoon ^- dime + ?: ?=(%dbug -.gen) $(gen q.gen) + ?. ?=([?(%rock %sand) @ @] gen) ~|([%bad-literal gen] !!) + +.gen +-- diff --git a/desk/lib/dbug.hoon b/desk/lib/dbug.hoon new file mode 100644 index 0000000..ce98619 --- /dev/null +++ b/desk/lib/dbug.hoon @@ -0,0 +1,155 @@ +:: dbug: agent wrapper for generic debugging tools +:: +:: usage: %-(agent:dbug your-agent) +:: +|% ++$ poke + $% [%bowl ~] + [%state grab=cord] + [%incoming =about] + [%outgoing =about] + == +:: ++$ about + $@ ~ + $% [%ship =ship] + [%path =path] + [%wire =wire] + [%term =term] + == +:: +++ agent + |= =agent:gall + ^- agent:gall + !. + |_ =bowl:gall + +* this . + ag ~(. agent bowl) + :: + ++ on-poke + |= [=mark =vase] + ^- (quip card:agent:gall agent:gall) + ?. ?=(%dbug mark) + =^ cards agent (on-poke:ag mark vase) + [cards this] + =/ dbug + !<(poke vase) + =; =tang + ((%*(. slog pri 1) tang) [~ this]) + ?- -.dbug + %bowl [(sell !>(bowl))]~ + :: + %state + =? grab.dbug =('' grab.dbug) '-' + =; product=^vase + [(sell product)]~ + =/ state=^vase + :: if the underlying app has implemented a /dbug/state scry endpoint, + :: use that vase in place of +on-save's. + :: + =/ result=(each ^vase tang) + (mule |.(q:(need (need (on-peek:ag /x/dbug/state))))) + ?:(?=(%& -.result) p.result on-save:ag) + %+ slap + (slop state !>([bowl=bowl ..zuse])) + (ream grab.dbug) + :: + %incoming + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by sup.bowl) + |= [[* a=[=ship =path]] [* b=[=ship =path]]] + (aor [path ship]:a [path ship]:b) + |= [=duct [=ship =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[path=path from=ship duct=duct]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire %+ lien duct + |=(=wire ?=(^ (find wire.about.dbug wire))) + %term !! + == + :: + %outgoing + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by wex.bowl) + |= [[[a=wire *] *] [[b=wire *] *]] + (aor a b) + |= [[=wire =ship =term] [acked=? =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[wire=wire agnt=[ship term] path=path ackd=acked]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire ?=(^ (find wire.about.dbug wire)) + %term =(term term.about.dbug) + == + == + :: + ++ on-peek + |= =path + ^- (unit (unit cage)) + ?. ?=([@ %dbug *] path) + (on-peek:ag path) + ?+ path [~ ~] + [%u %dbug ~] ``noun+!>(&) + [%x %dbug %state ~] ``noun+!>(on-save:ag) + [%x %dbug %subscriptions ~] ``noun+!>([wex sup]:bowl) + == + :: + ++ on-init + ^- (quip card:agent:gall agent:gall) + =^ cards agent on-init:ag + [cards this] + :: + ++ on-save on-save:ag + :: + ++ on-load + |= old-state=vase + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-load:ag old-state) + [cards this] + :: + ++ on-watch + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-watch:ag path) + [cards this] + :: + ++ on-leave + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-leave:ag path) + [cards this] + :: + ++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-agent:ag wire sign) + [cards this] + :: + ++ on-arvo + |= [=wire =sign-arvo] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-arvo:ag wire sign-arvo) + [cards this] + :: + ++ on-fail + |= [=term =tang] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-fail:ag term tang) + [cards this] + -- +-- diff --git a/desk/lib/fetch.hoon b/desk/lib/fetch.hoon new file mode 100644 index 0000000..bd74deb --- /dev/null +++ b/desk/lib/fetch.hoon @@ -0,0 +1,546 @@ +/- *boke, tp=trill-post, tlonc=tlon-channels +/+ sr=sortug, plib=trill-utils, kaji, const=constants, wall +|_ [s=state =bowl:gall] ++* wal ~(. wall src.bowl) +++ bulk-post-by-pid +|= pids=(list pid:tp) ^- (list post:tp) + %+ roll pids |= [=pid:tp acc=(list post:tp)] + =/ post (get:gorm:tp feed.s pid) + ?~ post acc :_ acc u.post + +++ thread-children +=| start=@ud +|= ted=thread:tp ^- cpage:tp + =| i=@ud + =/ lim (add thread-page-size:const start) + =/ cp=cpage:tp [~ start thread-page-size:const] + =/ pids (flop replies.ted) + =/ r=cpage:tp + |- + ?~ pids cp + ?: (lth i start) $(pids t.pids, i +(i)) + ?: (gte i lim) cp + =/ post (get:gorm:tp feed.s i.pids) + ?~ post $(pids t.pids) + =/ np [u.post p.cp] + =. cp cp(p np, bot i) + $(pids t.pids, i +(i)) + + r(p (flop p.r)) + +++ older-children +|= [ted=thread:tp ind=@ud] ^- cpage:tp + %. ted + %* . thread-children start ind == + +++ newer-children +|= [ted=thread:tp ind=@ud] ^- cpage:tp + =/ lim thread-page-size:const + =/ start ?: (lte ind lim) 0 (sub ind lim) + %. ted + %* . thread-children start start == + +++ gated-post + |= =pid:tp ^- (unit post:tp) + =/ upost (get:gorm:tp feed.s pid) + ?~ upost ~ + ?: (post-filter:wal tags.u.upost) upost ~ +++ by-path + |= pat=path ^- (unit post:tp) + =/ pid (~(get by paths.s) pat) + ?~ pid ~ + (gated-post u.pid) +++ post + |= hash=@t ^- (unit post:tp) + =/ pid (dec:kaji hash pid:tp) + ?~ pid ~ (gated-post u.pid) +++ fn-by-pid +|= =pid:tp ^- (unit full-node:tp) + =/ post (gated-post pid) + ?~ post ~ + %- some (node-to-full:plib u.post feed.s) +++ fn-by-hash +|= hash=@t ^- (unit full-node:tp) + =/ pid (dec:kaji hash pid:tp) + ?~ pid ~ + =/ post (gated-post u.pid) + ?~ post ~ + %- some (node-to-full:plib u.post feed.s) +++ thread-by-hash + |= hash=@t ^- (unit [thread:tp post:tp]) + =/ pid (dec:kaji hash pid:tp) + ?~ pid ~ + =/ ted (get:torm:tp threads.s u.pid) + ?~ ted ~ + =/ post (gated-post u.pid) + ?~ post ~ + %- some [u.ted u.post] +++ op-by-hash + |= hash=@t ^- (unit [thread:tp full-node:tp]) + =/ pid (dec:kaji hash pid:tp) + ?~ pid ~ + =/ ted (get:torm:tp threads.s u.pid) + ?~ ted ~ + =/ post (gated-post u.pid) + ?~ post ~ + %- some :- u.ted (node-to-full:plib u.post feed.s) +++ op-by-pid + |= =pid:tp ^- (unit [thread:tp full-node:tp]) + =/ ted (get:torm:tp threads.s pid) + ?~ ted ~ + =/ post (gated-post pid) + ?~ post ~ + %- some :- u.ted (node-to-full:plib u.post feed.s) +++ thread + |= =path + ^- (unit thread:tp) + =/ pid (~(get by paths.s) path) + ?~ pid ~ + (get:torm:tp threads.s u.pid) +++ op-by-path :: blog posts or thread ops + |= =path + ^- (unit [thread:tp full-node:tp]) + =/ pid (~(get by paths.s) path) + ?~ pid ~ + =/ ted (get:torm:tp threads.s u.pid) + ?~ ted ~ + =/ poast (gated-post u.pid) + ?~ poast ~ + %- some :- u.ted (node-to-full:plib u.poast feed.s) +++ tag-search + |= q=@t ^- (list [@t count=@ud]) + %+ roll ~(tap by tags.s) |= [i=[tag=@t =pidmap] acc=(list [@t @ud])] + ?. (tag-filter:wal tag.i) acc + ?: .=('' tag.i) acc + ?. (cfind:sr q tag.i .n) acc :_ acc + :- tag.i (wyt:porm:tp pidmap.i) + +++ thread-page-no-wall +|= [r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ l (tap:torm:tp threads.s) + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ t=thread:tp +.i.l + =. tpage (collect-thread-no-wall t tpage r f) + $(l t.l) +:: +++ thread-page-all +|= [r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ l (tap:torm:tp threads.s) + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ t=thread:tp +.i.l + =. tpage (collect-thread t tpage r f) + $(l t.l) +++ active-thread-page-all +|= [r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ l (tap:porm:tp active-threads.s) + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ =pid:tp +.i.l + =/ ut (get:torm:tp threads.s pid) + ?~ ut $(l t.l) + =/ t=thread:tp u.ut + =. tpage (collect-thread t tpage r f) + $(l t.l) + +++ thread-page-by-board + |= [cat=@tas r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ tag-set (~(get by categories:const) cat) + ?~ tag-set [~ r] + %^ thread-page-by-tags ~(tap in u.tag-set) r f +++ active-thread-page-by-board + |= [cat=@tas r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ tag-set (~(get by categories:const) cat) + ?~ tag-set [~ r] + %^ active-thread-page-by-tags ~(tap in u.tag-set) r f + +++ thread-page-by-tags +|= [tags=(list @t) r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + :: =. tags (tags:wal tags) + ~> %bout.[0 %filter-tags-first] + =/ pids %+ roll tags |= [t=@t acc=pidmap] + =/ pids (~(get by tags.s) t) + ?~ pids acc + (uni:porm:tp acc u.pids) + ?: .=((wyt:porm:tp pids) 0) [~ r] + =/ l (fetch-threads-2 (tap:porm:tp pids)) + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ t=thread:tp i.l + =. tpage (collect-thread t tpage r f) + $(l t.l) + +++ active-thread-page-by-tags +|= [tags=(list @t) r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + :: =. tags (tags:wal tags) + ~> %bout.[0 %filter-tags-first] + =/ pids %+ roll tags |= [t=@t acc=pidmap] + =/ pids (~(get by tags.s) t) + ?~ pids acc + (uni:porm:tp acc u.pids) + ?: .=((wyt:porm:tp pids) 0) [~ r] + =/ l (fetch-last-replies (tap:porm:tp pids)) + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ t=thread:tp i.l + =. tpage (collect-thread t tpage r f) + $(l t.l) + + + +++ thread-page-by-tags2 +|= [tags=(list @t) r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =. tags (tags:wal tags) + ~> %bout.[0 %filter-threads-first] + =/ l (tap:torm:tp threads.s) + ?~ l [~ r] + =/ ff |= t=thread:tp ?= ^ (~(int in tags.t) (silt tags)) + =/ l=(list [pid:tp thread:tp]) l + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ t=thread:tp +.i.l + =. tpage (collect-thread t tpage r `ff) + $(l t.l) +:: +++ fetch-last-replies +|= lp=(list [pid:tp pid:tp]) ^- (list thread:tp) + :: %- flop + %- sort :_ |= [a=thread:tp b=thread:tp] + =/ last-a ?~ replies.a pid.a i.replies.a + =/ last-b ?~ replies.b pid.b i.replies.b + (gte id.last-a id.last-b) + %+ roll lp |= [[* =pid:tp] acc=(list thread:tp)] + =/ t (get:torm:tp threads.s pid) + ?~ t acc + [u.t acc] + +++ fetch-threads-2 +|= lp=(list [pid:tp pid:tp]) ^- (list thread:tp) + %- flop + %+ roll lp |= [[* =pid:tp] acc=(list thread:tp)] + =/ t (get:torm:tp threads.s pid) + ?~ t acc [u.t acc] +++ fetch-threads +|= lp=(list pid:tp) ^- (list thread:tp) + %- flop + %+ roll lp |= [=pid:tp acc=(list thread:tp)] + =/ t (get:torm:tp threads.s pid) + ?~ t acc [u.t acc] + +++ thread-page +|= [l=(list thread:tp) r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =| =tpage:tp + |- + ?~ l tpage(p (flop p.tpage)) + ?: (gte count.tpage count.r) tpage(p (flop p.tpage)) + =/ t=thread:tp i.l + =. tpage (collect-thread t tpage r f) + $(l t.l) + +++ collect-thread +|= [t=thread:tp =tpage:tp r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ id=@da id.pid.t + ?. (post-filter:wal tags.t) tpage + ?. (page-cond id r) tpage + ?: ?& ?=(^ f) + =/ fres (u.f t) ?!(fres) == tpage + :: :: + =/ oldest ?~ older.tpage `id + ?: (lth id u.older.tpage) `id older.tpage + =/ newest ?~ newer.tpage `id + ?: (gth id u.newer.tpage) `id newer.tpage + %= tpage + p [t p.tpage] + older oldest + newer newest + count +(count.tpage) + == +++ collect-thread-no-wall +|= [t=thread:tp =tpage:tp r=page-req:tp f=(unit tfilter:tp)] ^- tpage:tp + =/ id=@da id.pid.t + ?. (page-cond id r) tpage + ?: ?& ?=(^ f) + =/ fres (u.f t) ?!(fres) == tpage + :: :: + =/ oldest ?~ older.tpage `id + ?: (lth id u.older.tpage) `id older.tpage + =/ newest ?~ newer.tpage `id + ?: (gth id u.newer.tpage) `id newer.tpage + %= tpage + p [t p.tpage] + older oldest + newer newest + count +(count.tpage) + == + + + +++ check-age +|= [id=@da newer=cursor:tp older=cursor:tp] ^- ? + ?~ newer + ?~ older .y + (lth id u.older) + ?~ older + (gth id u.newer) + ?&((gth id u.newer) (lth id u.older)) + +++ page-cond +|= [id=@da r=page-req:tp] ^- ? +?~ newer.r + :: newest not bound + ?~ older.r + :: neither oldest or newest is bound + .y + :: oldest is bound, newest isn't + (lth id u.older.r) + :: newest bound + ?~ older.r + :: newest is bound, oldest isn't + (gth id u.newer.r) + :: both are bound + ?&((lth id u.older.r) (gth id u.newer.r)) +++ get-post-page + |= [req=page-req:tp filter=(unit $-(post:tp ?))] ^- spage:tp + :: ~> %bout.[0 %get-post-page-rec] + =/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == + =/ l ?. from-bottom (tap:gorm:tp feed.s) (flop (tap:gorm:tp feed.s)) + :: =| max=@da :: need to define the max and minimum + :: =| min=@da + :: this is what we return + =| p=spage:tp + |- + ?~ l p :: end of iteration + =/ [[=ship =id:tp] =post:tp] i.l + ?. (page-cond id req) p :: exit condition + =/ ok ?~ filter .y (u.filter post) + ?. ok $(l t.l) + :: =/ max ?: (gth id max) id max + :: =/ min ?: ?|((lth id min) .=(min *@da)) id min + =/ oldest ?~ older.p `id + ?: (lth id u.older.p) `id older.p + =/ newest ?~ newer.p `id + ?: (gth id u.newer.p) `id newer.p + %= $ + l t.l + p.p [post p.p] + older.p oldest + newer.p newest + count.p +(count.p) + == +++ get-fn-page + |= [req=page-req:tp filter=(unit $-(post:tp ?))] ^- page:tp + :: ~> %bout.[0 %get-fn-page-rec] + =/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == + =/ l ?. from-bottom (tap:gorm:tp feed.s) (flop (tap:gorm:tp feed.s)) + :: =| max=@da :: need to define the max and minimum + :: =| min=@da + :: this is what we return + =| p=page:tp + |- + ?~ l p :: end of iteration + =/ [[=ship =id:tp] =post:tp] i.l + ?. (page-cond id req) p :: exit condition + =/ ok ?~ filter .y (u.filter post) + ?. ok $(l t.l) + :: =/ max ?: (gth id max) id max + :: =/ min ?: ?|((lth id min) .=(min *@da)) id min + =/ oldest ?~ older.p `id + ?: (lth id u.older.p) `id older.p + =/ newest ?~ newer.p `id + ?: (gth id u.newer.p) `id newer.p + =/ fn (node-to-full:plib post feed.s) + %= $ + l t.l + p.p [fn p.p] + older.p oldest + newer.p newest + count.p +(count.p) + == + :: Search +++ get-chat-id +|= r=reference:tlonc ^- @da + ?- -.r + %post id.post.r + %reply id-post.r + == +++ search +|= [s=section query=@t tags=(list @t) r=page-req:tp] ^- search-res + ?: ?=(%chat s) :- %chat (search-chat query r) + :- %trill (search-dap s query r) + +++ sort-fn +|= p=(list [full-node:tp @t]) ^- (list [full-node:tp @t]) + %+ sort p |= [a=[full-node:tp @t] b=[full-node:tp @t]] (gth id.p.-.a id.p.-.b) +:: +++ collect-search +|= [sp=search-page query=@t =post:tp req=page-req:tp filter=(unit pfilter:tp)] +^- search-page + =/ id id.post + ?. (check-age id newer.req older.req) sp + ?. (post-filter:wal tags.post) sp + ?: ?& ?=(^ filter) + =/ fres (u.filter post) ?!(fres) == sp + =/ content-snip=@t (text-search-ind:plib query 150 post .n) + ?: .=(content-snip '') sp + =/ oldest ?~ older.sp `id + ?: (lth id u.older.sp) `id older.sp + =/ newest ?~ newer.sp `id + ?: (gth id u.newer.sp) `id newer.sp + =/ fn (node-to-full:plib post feed.s) + %= sp + res [[fn content-snip] res.sp] + older oldest + newer newest + == + +++ search-feed +|= [query=@t req=page-req:tp filter=(unit pfilter:tp)] ^- search-page + =/ bottom ?~ newer.req ~ `[~zod u.newer.req] + =/ top ?~ older.req ~ `[~zod u.older.req] + =/ subfeed (lot:gorm:tp feed.s top bottom) + =/ l (tap:gorm:tp subfeed) + (search-tap query l req filter) + +++ search-tap +|= [query=@t l=(list [=pid:tp =post:tp]) req=page-req:tp filter=(unit pfilter:tp)] + ^- search-page + =| p=search-page + |- + ?~ l p(res (sort-fn res.p)) + ?: (gte (lent res.p) count.req) p(res (sort-fn res.p)) + =/ =post:tp post.i.l + =. p (collect-search p query post req filter) + $(l t.l) + + +++ search-pids-full +|= [query=@t l=(list pid:tp) req=page-req:tp filter=(unit pfilter:tp)] ^- search-page + =| p=search-page + |- + ?~ l p(res (sort-fn res.p)) + ?: (gte (lent res.p) count.req) p(res (sort-fn res.p)) + =/ post (get:gorm:tp feed.s i.l) + ?~ post $(l t.l) + =. p (collect-search p query u.post req filter) + $(l t.l) + ++$ dpage [by-title=(list [full-node:tp @t]) by-content=(list [full-node:tp @t]) newer=cursor:tp older=cursor:tp] + +++ collect-thread-search +|= [dp=dpage query=@t t=thread:tp =post:tp req=page-req:tp f=(unit bfilter:tp)] ^- dpage + ?: ?& ?=(^ f) + =/ fres (u.f [t post]) ?!(fres) == dp + =/ id id.pid.t + ?. (page-cond id req) dp + ?. (post-filter:wal tags.post) dp + =/ title-match=? (cfind:sr query title.t .n) + ?: title-match + =/ fn (node-to-full:plib post feed.s) + =/ nc (update-cursors id older.dp newer.dp) + dp(by-title [[fn ''] by-title.dp], older -.nc, newer +.nc) + =/ content-snip=@t (text-search-ind:plib query 200 post .n) + ?. .=('' content-snip) + =/ fn (node-to-full:plib post feed.s) + =/ nc (update-cursors id older.dp newer.dp) + dp(by-content [[fn content-snip] by-content.dp], older -.nc, newer +.nc) + :: no match + dp +++ consolidate-search +|= d=dpage ^- search-page + :+ (weld (sort-fn by-title.d) (sort-fn by-content.d)) + newer.d older.d + +++ update-cursors +|= [id=@da older=cursor:tp newer=cursor:tp] ^- [older=cursor:tp newer=cursor:tp] + =/ o ?~ older `id + ?: (lth id u.older) `id older + =/ n ?~ newer `id + ?: (gth id u.newer) `id newer + [o n] +++ search-blog +|= [query=@t req=page-req:tp] ^- search-page + =/ pidm (~(get by tags.s) 'blog') + ?~ pidm *search-page + =/ l (tap:porm:tp u.pidm) + %- consolidate-search + =| p=dpage + |- + ?~ l p + =/ =pid:tp +.i.l + =/ count (add (lent by-title.p) (lent by-content.p)) + ?: (gte count count.req) p + =/ post (get:gorm:tp feed.s pid) + ?~ post $(l t.l) + =/ ted (get:torm:tp threads.s pid) + ?~ ted $(l t.l) + =. p (collect-thread-search p query u.ted u.post req ~) + $(l t.l) +:: +++ search-comments +|= [query=@t r=page-req:tp] ^- search-page + =/ pids %+ roll (tap:torm:tp threads.s) |= [[* thread:tp] acc=(list pid:tp)] + (weld acc replies) + (search-pids-full query pids r ~) + +++ search-threads +|= [query=@t req=page-req:tp] ^- search-page + =/ l (tap:torm:tp threads.s) + =/ filter |= [=thread:tp =post:tp] + ?& !(~(has in tags.post) 'blog') + !(~(has in tags.post) 'blog-comment') + == + %- consolidate-search + =| p=dpage + |- + ?~ l p + =/ t=thread:tp +.i.l + =/ count (add (lent by-title.p) (lent by-content.p)) + ?: (gte count count.req) p + =/ post (get:gorm:tp feed.s pid.t) + ?~ post $(l t.l) + =. p (collect-thread-search p query t u.post req `filter) + $(l t.l) +++ search-replies +|= [query=@t r=page-req:tp] ^- search-page + =/ filter |= =post:tp + ?& !(~(has in tags.post) 'blog') + !(~(has in tags.post) 'blog-comment') + ?=(^ parent.post) + == + (search-feed query r `filter) + +++ search-dap +|= [s=$?(%blog %comments %threads %replies) query=@t r=page-req:tp] ^- search-page + ?- s + %blog (search-blog query r) + %comments (search-comments query r) + %threads (search-threads query r) + %replies (search-replies query r) + == +++ search-chat +|= [query=@t req=page-req:tp] ^- chat-page + =/ flag /chat/(scot %p our.bowl)/chat + =/ pat /search/text/(scot %ud 0)/(scot %ud count.req)/[query] + =/ chat-scry (~(scry io:sr bowl) %channels (weld flag pat) scan:tlonc) + ?~ chat-scry *chat-page + =/ rev (flop chat-scry) + ?~ rev *chat-page + =/ head i.chat-scry + =/ tail i.rev + =/ newer (some (get-chat-id head)) + =/ older (some (get-chat-id tail)) + [chat-scry older newer (lent chat-scry)] +-- diff --git a/desk/lib/json.hoon b/desk/lib/json.hoon new file mode 100644 index 0000000..37ecb03 --- /dev/null +++ b/desk/lib/json.hoon @@ -0,0 +1,179 @@ +/+ sortug +|% +++ de +=, dejs:format +|% +++ boardpost +%- ar %- ot +:~ author+so + op+so + thread+de-date + date+de-date + title+so + content+(ar content) + id+ni + tid+ni +== +++ comment +%- ar %- ot +:~ author+so + date+de-date + content+(ar content) + pa+so + parent+de-date + post+de-date + title+so +== +++ soo +|= jon=json +?~ jon '' +?>(?=([%s *] jon) p.jon) +++ poast +%- ar +%- ot +:~ title+so + url+de-url + content+(ar content) + date+di + tags+de-tags + id+ni +== +++ de-tags +|= j=json ^- (set @t) +?> ?=(%s -.j) +=/ ret (rush +.j (split:parsing:sortug hep)) +%- sy +?~ ret ~[+.j] %+ roll u.ret |= [=tape acc=(list @t)] ?~ tape acc [(crip tape) acc] +++ de-date :: just use di? +|= j=json ^- @da +?> ?=(%n -.j) +=/ n (rash +.j dem) +(from-unix-ms:chrono:userlib n) +++ off +|* wer=(pole [cord fist]) + |= jon=json + ?> ?=([%o [@ *] ~ ~] jon) + |- + ?- wer + :: [[key=@t wit=*] t=*] + [[key=@t *] t=*] + => .(wer [[* wit] *]=wer) + ?: =(key.wer p.n.p.jon) + [key.wer ~|(key+key.wer (wit.wer q.n.p.jon))] + ?~ t.wer ~|(bad-key+p.n.p.jon !!) + ((of t.wer) jon) + == +++ content +%- of +:~ paragraph+(ar inline) + blockquote+(ar inline) + heading+heading + list+clists + media+media + codeblock+dcode + tasklist+(ar de-task) + eval+so + ref+ref + json+external +== +++ inline +|= jon=json %. jon +%- of +:~ text+so + italic+so + bold+so + strike+so + ship+(se %p) + date+di + note+de-note + codespan+so + link+link + break+ul + underline+so + sup+so + sub+so + ruby+de-ruby +== +++ de-task +%- ot +:~ text+(ar inline) + done+bo +== +++ de-note +%- ot +:~ id+so + text+(ar inline) +== +++ de-ruby +%- ot +:~ p+so + q+so +== +++ dcode +%- ot +:~ code+so + lang+so +== +++ link +%- ot +:~ href+so + show+so +== +++ heading +%- ot +:~ text+so + :- %num + |= j=json + ?> ?=(%n -.j) + =/ n (rash +.j dem) + ?: .=(1 n) %h1 + ?: .=(2 n) %h2 + ?: .=(3 n) %h3 + ?: .=(4 n) %h4 + ?: .=(5 n) %h5 + ?: .=(6 n) %h6 %h6 +== +++ clists +|= jon=json +%. jon +%- ot +:~ :- %text + |= j=json =/ i ((ar inline) j) + ~[~[[%paragraph i]]] + ordered+bo +== +++ media +%- of +:~ images+(ar de-image) + video+so + audio+so +== +++ de-image +%- ot +:~ url+so + caption+so +== +++ ref +%- ot +:~ type+(se %tas) + ship+(se %p) + path+dpath +== +++ external +%- ot +:~ origin+(se %tas) + content+so +== +++ dpath :: from resource +%- su +%+ cook +|= l=(list @t) `path`+.l +(more fas urs:ab) +++ de-url :: from resource +%- su +%+ cook +|= l=(list @t) `path`l +=/ f (cook |=(a=tape (crip a)) (star ;~(less fas next))) +(more fas f) +-- +-- diff --git a/desk/lib/kaji-min.js b/desk/lib/kaji-min.js new file mode 100644 index 0000000..f683846 --- /dev/null +++ b/desk/lib/kaji-min.js @@ -0,0 +1 @@ +const t=`${Date.now()}${Math.floor(100*Math.random())}`,e=`/~/channel/${`kaji-${t}`}`;let n=0;const o=new DOMParser;function i(t,e){t.innerHTML=e,r(t)}function r(t){const e=t instanceof HTMLElement;if(!t)return;const n=t.querySelectorAll("[kaji]");e&&t.getAttribute("kaji")&&h(t),n.forEach((t=>h(t)))}async function a(t){console.log({channelPath:e,bodies:t},"put body");const n=await fetch(e,{method:"PUT",body:JSON.stringify(t)});return await n}function subscribe(t){document.addEventListener("DOMContentLoaded",(()=>{a([P(window.ship,window.app,t)])}))}function c(t){const n=JSON.parse(t.data);if("diff"!==n.response)return;!async function(t){await fetch(e,{method:"PUT",body:$(t)})}(n.id);const i=n.json;if(i&&0!==i?.length)for(let t of i)if(console.log(t,"sse command"),"refresh"in t&&window.location.reload(!0),"redi"in t&&d(t.redi),"focus"in t&&s(t.focus),"scroll"in t&&l(t.scroll),"url"in t&&u(t.url),"custom"in t)f(t.custom);else{const e=t[Object.keys(t)[0]].manx,n=o.parseFromString(e,"text/html").body.firstChild;"swap"in t&&N(null,n,t.swap.sel,t.swap.inner),"add"in t&&E(null,n,t.add.container,t.add.where),"modal"in t&&p(n),"alert"in t&&m(n,t.alert.duration)}}function s(t){const e=document.querySelector(t);e&&e.focus()}function l(t){const e=document.querySelector(t);e&&e.scrollIntoView()}function u(t){window.history.pushState(null,null,t)}function d(t){console.log(t,"redirecting"),window.location.href=t}function f(t){const e=new CustomEvent("kaji-fact",{detail:t});document.dispatchEvent(e)}function p(t){const e=document.createElement("div");e.id="kaji-modal-bg";const n=document.createElement("div");n.id="kaji-modal-fg",i(n,t),e.appendChild(n),document.body.appendChild(e),window.onclick=function(t){t.target==e&&e.remove()}}function m(t,e){const n=document.createElement("div");n.id="kaji-alert",n.appendChild(t),document.body.appendChild(n),setTimeout((()=>document.body.removeChild(n)),e)}function g(t,e){for(let n of t.attributes){const t=n.name,o=n.value;if("class"===t||"id"===t)continue;const i=e.getAttribute(t);o&&!i&&e.setAttribute(t,o)}}function h(n){const c=n.getAttribute("kaji");if("mobile"===c)!async function(t){const e=t.getAttribute("path");if(!(window.innerWidth<768))return;const n=await fetch(e),i=await n.text(),a=o.parseFromString(i,"text/html").body.firstChild;r(a),t.replaceWith(a)}(n);else if("fetch"===c)!async function(t){const e=await fetch(t.getAttribute("src")),n=await e.text(),i=o.parseFromString(n,"text/html").body.firstChild;t.replaceWith(i)}(n);else if("iscroll"===c)!function(t){let e=new IntersectionObserver(((e,n)=>{e.forEach((e=>{if(e.isIntersecting){const o=function(t){const e=document.createElement("img");return e.src="spinner.svg",e.classList.add("iscroll-spinner"),t.replaceWith(e),e}(e.target);y(C(t)).then((n=>{if(!n)return;const i=e.target.getAttribute("cont");E(t,n,i,v(t)),A({swapMode:"add",container:i,element:n}),o.remove()})),n.unobserve(e.target)}}))}));e.observe(t)}(n);else if("search"===c)!function(t){const e=t.getAttribute("bounce"),n=Number(e||0);if(Number.isNaN(n))return w("bounce setting NaN");const o=e=>async function(t,e){console.log(t,"scry event"),t.preventDefault();const n=C(e);console.log(n,"url"),k(e,!0);const o=e.getAttribute("swap"),i=await y(n);if(!i)return;const r=e.getAttribute("show-params");r&&S(n);let a;if("swap"===o){j(e);const t=e.getAttribute("targ"),n=e.getAttribute("where");a=N(e,i,t,!n||"inner"===n)}else if("add"===o){const t=e.getAttribute("cont");a=await E(e,i,t,v(e))}k(e,!1),a&&A({swapMode:o,container:a})}(e,t),i=((t,e)=>{let n;return(...o)=>{clearTimeout(n),n=setTimeout((()=>t(...o)),e)}})(o,n);t.addEventListener("keyup",i)}(n);else if("clickaway"===c)!function(t){window.onclick=function(e){t.contains(e.target)||(t.hidden=!0)}}(n);else{const o=n.getAttribute("trigger")||function(t){const e=t.tagName.toLowerCase();if("form"===e)return"submit";return"input"===e||"textarea"===e||"select"===e?"change":"click"}(n);n.addEventListener(o,(o=>{!function(n,o,r){"navi"===r&&async function(t,e){t.preventDefault();const n=e.getAttribute("path"),o=L(t.target),r=n||o;if(!r)throw new Error("no fetch path found");const a=await fetch(r),c=await a.text(),s=t.target.closest("#kaji-modal-fg");i(s||document.querySelector("body"),c)}(n,o);"modal"===r&&async function(t,e){const n=e.getAttribute("path"),o=L(t.target),i=n||o;if(!i)throw new Error("no fetch path found");const r=await fetch(i);p(await r.text())}(n,o);"toggle"===r&&function(t,e){t.stopPropagation();const n=t.target.getAttribute("targ");if(!n)return;const o=n.split("/").map((e=>b(t.target,e)));o.forEach((e=>{t.target.getAttribute("modal")&&function(t){const e=document.createElement("div");e.id="kaji-modal-bg";const n=document.createElement("div");n.id="kaji-modal-fg",n.appendChild(t),e.appendChild(n),document.body.appendChild(e),window.onclick=function(t){t.target==e&&e.remove()}}(e),e&&(e.hidden=!e.hidden)}))}(n);"destroy"===r&&function(t,e){t.stopPropagation();const n=t.target.getAttribute("targ");if(!n)return;const o=n.split("/").map((e=>b(t.target,e)));for(let t of o)t&&t.parentElement.removeChild(t)}(n);"scry"===r&&async function(t){console.log(t,"scry event");const e=t.target;!function(t){let e=t.parentElement;for(;e;)g(e,t),e=e.parentElement}(e);const n=e.getAttribute("path")||window.location.href,o=new URLSearchParams(window.location.search),[i,r]=n.split("?");if(r){const t=new URLSearchParams(r);for(let[e,n]of t.entries())o.set(e,n)}const a=e.getAttribute("name");a&&o.set(a,e.value);const c=`${n}?${o.toString()}`;t.preventDefault();const s=e.getAttribute("swap")||"swap";k(e,!0);const l=await y(c);if(console.log(l,"nel"),!l)return;const u=e.getAttribute("show-params");u&&S(c);let d;if("swap"===s){j(e);const t=e.getAttribute("targ"),n=e.getAttribute("where");d=N(e,l,t,!n||"inner"===n)}else if("add"===s){const t=e.getAttribute("cont");d=await E(e,l,t,v(e))}k(e,!1),d&&A({swapMode:s,container:d})}(n);"watch"===r&&async function(t,n){const o=n.getAttribute("ship"),i=n.getAttribute("app"),r=n.getAttribute("path"),a=P(o,i,r);await fetch(e,{method:"PUT",body:a})}(0,o);"poke"===r&&async function(e,n){e.preventDefault();n.getAttribute("ship"),n.getAttribute("app");const o=n.getAttribute("mark")||"kaji",i=n.getAttribute("json");console.log(n.params,"poke params?");const r=e.currentTarget,c=r.getAttribute("action"),s=r.getAttribute("name"),l=r.getAttribute("payload"),u=i||("FORM"===r.tagName?{action:c,...x(r)}:c?{action:c,[s]:l}:{action:s,[s]:l});e.stopPropagation(),"FORM"===r.tagName&&function(t){if(!t.getAttribute("wipe"))return;const e=[...t.getElementsByTagName("input"),...t.getElementsByTagName("textarea")];for(let t of e)"text"===t.type.toLowerCase()&&(t.value=""),"TEXTAREA"===t.tagName&&(t.value="")}(r);const d={...u,origin:window.location.pathname,tab:t};console.log(d,"poke params");const f=[T(window.ship,window.app,o,d)];await a(f)}(n,o);"thread"===r&&async function(t,e){console.log(e.params,"thread params?");const n=e.getAttribute("desk"),o=e.getAttribute("thread"),i=e.getAttribute("input-mark")||"kaji",r=e.getAttribute("output-mark")||"kaji",a=e.getAttribute("noun");fetch(`/spider/${n}/${i}/${o}/${r}.kaji`,{headers:{"Content-type":"application/x-urb-jam"},method:"POST",body:a})}(0,o)}(o,n,c)}))}}function w(t){console.log(t)}function b(t,e){if(console.log(t,"looking above"),console.log(e,"sel"),!e)return console.log(e,"selector not found"),null;if("#"===e[0])return document.getElementById(e.slice(1));if(!t)return null;const n=t.querySelector(e);return n||b(t.parentElement,e)}async function y(t){console.log(t,"router scry");const e=await fetch(t),n=await e.text(),i=o.parseFromString(n,"text/html").body.firstChild;return function(t,e){if(!e)return console.log(t,"No element found scrying"),!0;if("kaji-alert"===e.id){const t=e.getAttribute("dur");return m(e,Number(t)),!0}return!!e.getAttribute("kaji-error")}(n,i)?null:(r(i),function(t){const e=t.querySelectorAll("script");for(let t of e){const e=document.createElement("script");t.src?e.src=t.src:t.textContent&&(e.textContent=t.textContent),document.body.appendChild(e)}}(i),i)}function A(t){const e=new CustomEvent("kaji-scry",{detail:t});document.dispatchEvent(e)}function v(t){const e=t.getAttribute("where");if(!e)return{bottom:null};if("bottom"===e)return{bottom:null};if("top"===e)return{top:null};if("before"===e){const e=t.getAttribute("sibling");return e?{before:e}:null}return null}function E(t,e,n,o){o||w("no where given to addEls");const i=t?b(t,n):document.querySelector(n);for(i||w("no container given to addEls");e.firstChild;)if("top"in o)i.prepend(e.firstChild);else if("bottom"in o)i.appendChild(e.firstChild);else if("before"in o){const t=document.querySelector(o.before);t||w("sibling at addEls doesn't exist"),i.insertBefore(e.firstChild,t)}}function k(t,e){const n=t.getAttribute("indicator"),o=document.querySelector(n);o&&(o.style.display=e?"block":"none")}function C(t){!function(t){const e=function(t){const e=t.tagName.toLowerCase();return"input"===e||"select"===e||"option"===e||"textarea"===e||"button"===e}(t);if(!e)return;let n,o=t.parentElement;for(;!n&&o;)g(o,t),"form"===o.tagName.toLowerCase()?n=o:o=o.parentElement;n&&(t.params=x(n))}(t);const e=t.getAttribute("path")||window.location.href,n=new URLSearchParams(window.location.search),[o,i]=e.split("?");if(i){const t=new URLSearchParams(i);for(let[e,o]of t.entries())n.set(e,o)}const r=t.getAttribute("name"),a=t.params?t.params:"FORM"===t.tagName?x(t):{},c=new URLSearchParams(a),s=new URLSearchParams;for(let[t,e]of n.entries())s.set(t,e);r&&t.value&&s.set(r,t.value);for(let[t,e]of c.entries())s.set(t,e);return`${o}?${s.toString()}`}function S(t){const e=t.split("?")[1]||"";u(`${window.location.pathname}?${e}`)}function L(t){const e=t.closest("a");return e?e.href:null}function j(t){if(!t.classList.contains("tab"))return;t.parentElement;if(!t.classList.contains("active")){t.parentElement.querySelector(".active").classList.remove("active"),t.classList.add("active")}}function N(t,e,n,o){const i=t?b(t,n):document.querySelector(n);if(i){if(o)for(i.innerHTML="";e.firstChild;)i.appendChild(e.firstChild);else i.parentElement.replaceChild(e,i);return i}console.log("no container",n)}function x(t){const e=new FormData(t);return Object.fromEntries(e)}function P(t,e,o){return n++,{id:n,action:"subscribe",ship:t.slice(1),app:e,path:o}}function T(t,e,o,i){return n++,{id:n,action:"poke",ship:t.slice(1),app:e,mark:o,json:i}}function $(t){return n++,JSON.stringify([{id:n,action:"ack","event-id":t}])}addEventListener("DOMContentLoaded",(async()=>{await async function(){console.log(window.ship,"opening channel");const n=P(window.ship,window.app,window.liveUI),o=`/sse/${t}`,i=P(window.ship,window.app,o),r=T(window.ship,"hood","helm-hi","hai"),a=JSON.stringify([n,i,r]);await fetch(e,{method:"PUT",body:a}),eventSource=new EventSource(e),eventSource.addEventListener("message",c)}(),r(document),function(){const t=new URLSearchParams(window.location.search).get("goto");if(t){const e=document.getElementById(t);e?e.scrollIntoView({block:"center"}):console.log(t,"target not found")}}()}));
\ No newline at end of file diff --git a/desk/lib/kaji.css b/desk/lib/kaji.css new file mode 100644 index 0000000..c41d0d7 --- /dev/null +++ b/desk/lib/kaji.css @@ -0,0 +1,79 @@ +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +/* The Modal (background) */ +#kaji-modal-bg { + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgba(0, 0, 0, 0.4); + z-index: 998; +} + +/* Modal Content */ +#kaji-modal-fg { + background-color: var(--background-color); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + padding: 20px; + width: 80%; + z-index: 999; + max-height: 90vh; + max-width: 90vw; + overflow: auto; +} + +[kaji="modal"] { + cursor: pointer; +} + +#kaji-alert { + background-color: var(--background-color); + border: 2px solid var(--hong); + z-index: 999; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + padding: 0.5rem; +} + +button { + cursor: pointer; +} + +.hide { + display: none; +} + +.not-hide { + display: block; +} + +.iscroll-spinner { + display: block; + margin: 1rem auto; +}
\ No newline at end of file diff --git a/desk/lib/kaji.hoon b/desk/lib/kaji.hoon new file mode 100644 index 0000000..113fd84 --- /dev/null +++ b/desk/lib/kaji.hoon @@ -0,0 +1,379 @@ +/+ sr=sortug +/* kaji-js %js /lib/kaji-min/js +/* kaji-css %css /lib/kaji/css +|% ++$ kbowl + $: src=@p + now=@da + mob=? + == ++$ eyre-order [id=@ta req=inbound-request:eyre] ++$ req-line + $: pat=(pole knot) :: path + ext=(unit @ta) :: extension + par=(map @t @t) :: params + mob=? :: is-mobile + == ++$ form-data [action=@t input=(map @t @t)] +++ enc |= a=* ^- tape (scow:parsing:sr %uw (jam a)) +++ dec |* [a=@t m=mold] ^- (unit m) + =/ hash (slaw:parsing:sr %uw a) + ?~ hash ~ + ((soft m) (cue u.hash)) +++ dec-i |* [i=(map @t @t) key=@t =mold] ^- (unit mold) + =/ val (~(get by i) key) ?~ val ~ + =/ atm (slaw:parsing:sr %uw u.val) ?~ atm ~ + ((soft mold) (cue u.atm)) + + +:: ++ dec-form |* [=form-data d=(list [key=@t =mold])] +:: =| res=* +:: |- +:: ?~ d res +:: =/ val (~(get by in) key.i.d) +:: ?~ val ~ +:: =/ uw (scow %uw u.val) +:: ?~ uw +:: =/ is-t ((sane @t) (crip u.val)) +:: ?. is-t ~| "%kaji.- passed value {u.val} of wrong format" ~ +:: it's a @t +:: ${res [res (crip u.val), d t.d] +:: =/ dec-res ((soft mold.i.d) (cue u.uw)) +:: ?~ dec-res ~| "Failed to decode {(trip key.i.d)}" ~ +:: =/ nr [res u.dec-res] +:: $(res nr, d t.d) + +:: =df |* wer=(list [key=@t =mold]) +:: |= in=(map @t @t) +:: ?~ wer ~ +:: :_ ((df t.wer) in) +:: =/ val (~(get by in) key.i.wer) +:: ?~ val ~| "key {(trip key.i.wer)} not found in map" ~ +:: =/ uw (slaw %uw u.val) ?~ uw +:: ~& uw=uw +:: =/ is-t ((sane %t) u.val) +:: ~& is-t=is-t +:: ?. is-t ~| "%kaji.- passed value {u.val} of wrong format" ~ +:: u.val +:: =/ dec-res ((soft mold.i.wer) (cue u.uw)) +:: ?~ dec-res ~| "Failed to decode {(trip key.i.wer)}" ~ +:: u.dec-res + +:: =df |* [in=(map @t @t) d=(list [key=@t =mold])] +:: =| res=(unit) +:: |- +:: ~& res=res +:: ?~ d res +:: ~& key=key.i.d +:: =/ val (~(get by in) key.i.d) +:: ~& val=val +:: ?~ val ~ +:: =/ uw (slaw %uw u.val) ?~ uw +:: ~& uw=uw +:: =/ is-t ((sane %t) u.val) +:: ~& is-t=is-t +:: ?. is-t ~| "%kaji.- passed value {u.val} of wrong format" ~ +:: =/ nr ?~ res (some u.val) (some [(need res) u.val]) +:: $(res nr, d t.d) +:: =/ dec-res ((soft mold.i.d) (cue u.uw)) +:: ~& dec-res=dec-res +:: ?~ dec-res ~| "Failed to decode {(trip key.i.d)}" ~ +:: =/ nr ?~ res (some u.dec-res) (some [(need res) u.dec-res]) +:: $(res nr, d t.d) + +:: =m (malt `(list [@t @t])`~[['a' 'alpha'] ['b' (scot %uw (jam [our now]))]]) +:: =d `(list [@t mold])`~[['a' @] ['b' ,[@p @da]]] + + + + ++$ kaji-res +$% [%res eyre-res] + [%sse sse-res] +== ++$ sse-res + $: wire=kaji-wire + e=(list effect) + == ++$ kaji-wire + $% [%tab ~] + [%custom p=(list wire)] + [%all ~] + == ++$ eyre-res + $% [%full p=simple-payload:http] + [%page p=manx] + [%html p=manx] :: fragment + [%mime type=path p=@t] + [%glob p=mime] + == ++$ where + $% [%top ~] + [%bottom ~] + [%before sibling=@t] + == ++$ effect +$% [%redi url=@t] :: redirects; will replace the whole html of the site and update the tab history + [%swap =manx sel=@t inner=?] :: swaps a selector + [%add =manx container=@t =where] :: adds marl to a div + [%focus sel=@t] :: focuses on some selector + [%scroll sel=@t] :: scrolls to some selector + [%url url=@t] :: updates the url bar + [%modal =manx] :: opens a modal + [%alert =manx dur=@ud] :: opens an alert for given duration in ms + [%refresh ~] + [%custom =manx data=json] :: custom, you can set a handle for the 'kaji-fact' event in JS +== ++$ sse-card [%give %fact (list path) [%kaji vase]] + +++ ui-fact +|= [tab=@t res=(list effect)] ^- sse-card +=/ wire /sse/[tab] +[%give %fact ~[wire] [%kaji !>(res)]] + +++ live-fact +|= res=(list effect) ^- sse-card +[%give %fact ~[/ui] [%kaji !>(res)]] + +++ give-fact +|= [wires=(list path) res=(list effect)] ^- sse-card +[%give %fact wires [%kaji !>(res)]] + + +:: sse templates +++ ui + |_ tab-id=@t + ++ fact + |= res=(list effect) (ui-fact tab-id res) + ++ alert + =/ dur 2.000 + |= a=tape + =/ manx ;span:"{a}" + %+ ui-fact tab-id [%alert manx dur]^~ + ++ refresh-card :: wipe browser cache + %+ ui-fact tab-id [%refresh ~]^~ + -- +:: +:: response builders +:: eyre responses +++ error-response +|= code=@ud ^- eyre-res + :- %html (error-page code) +:: inline sse commands + +:: some helpers +:: manx builders +++ wrap-marl +|= m=marl ^- manx +;div + ;* m +== +++ error-page +|= code=@ud + ;html + ;body + ;p:"Error {<code>}" + == + == +++ fetch +|= pat=path +;div(kaji "fetch", src "{(trip (spat pat))}"); + + +++ add-error +|= m=manx ^- manx +=. a.g.m (snoc a.g.m [%kaji-error "true"]) +m +++ hide-manx +|= m=manx ^- manx +=. a.g.m :_ a.g.m [n=%hidden v=""] +m +++ modal +|= children=marl ^- manx +;div#kaji-modal-bg + ;div#kaji-modal-fg + ;* children + == +== +:: + +++ parse-formdata + |= body=(unit octs) ^- (unit (list [key=@t val=@t])) + ?~ body ~ + (rush q.u.body yquy:de-purl:html) + +++ get-redirect + |= redirect=cord + ^- simple-payload:http + [[303 ['location' redirect]~] ~] + +++ doctype "<!DOCTYPE html>" + +++ is-mobile + |= req=inbound-request:eyre ^- ? + =/ headers (malt header-list.request.req) + =/ ua (~(get by headers) 'user-agent') + =/ swidth (~(get by headers) 'x-kaji-vw') + ?~ ua ?~ swidth .n + =/ width (rush u.swidth dem) ?~ width .n + (lte u.width 800) + + ?| (cfind:sr 'android' u.ua .n) + (cfind:sr 'iphone' u.ua .n) + :: (cfind:sr 'ipad' u.ua .n) + == + +:: core functionality ++$ request-line-s + $: [ext=(unit @ta) site=(list @t)] + args=(list [key=@t value=@t]) + == +++ parse-req +|= req=inbound-request:eyre ^- req-line + =/ rl=(unit request-line-s) (rush url.request.req ;~(plug apat:de-purl:html yque:de-purl:html)) + ?~ rl + ~& >>> url-parsing-failed=url.request.req + !! + =/ is-mob (is-mobile req) + [path=site.u.rl ext.u.rl (malt args.u.rl) is-mob] + +++ manx-to-cord + |= [is-fragment=? =manx] ^- @t + %- crip + ?. is-fragment + %- en-xml:html manx + :: + %+ weld doctype + %- en-xml:html manx + +++ send-eyre-res + |= [eyre-id=@ta =simple-payload:http] + ^- (list card:agent:gall) + =/ header-cage + [%http-response-header !>(response-header.simple-payload)] + =/ data-cage + [%http-response-data !>(data.simple-payload)] + :~ [%give %fact ~[/http-response/[eyre-id]] header-cage] + [%give %fact ~[/http-response/[eyre-id]] data-cage] + [%give %kick ~[/http-response/[eyre-id]] ~] + == + +++ glob-payload + =| cache=_| + |= =mime ^- simple-payload:http + =/ content-type (rsh 3 (crip <p.mime>)) + =/ cache-header ?: cache + ['cache-control' 'max-age=86400'] + ['cache-control' 'no-cache, no-store, must-revalidate'] + :: ~& >>> ends-in=`@t`(swp 3 (end [3 5] (swp 3 q.q.mime))) + :_ `q.mime + [200 [['content-type' content-type] cache-header ~]] + +++ http-payload + =| cache=_| + |= [mime-type=path t=@t] ^- simple-payload:http + =/ content-type (rsh 3 (crip <mime-type>)) + =/ octs (as-octs:mimes:html t) + =/ cache-header ?: cache + ['cache-control' 'max-age=86400'] + ['cache-control' 'no-cache, no-store, must-revalidate'] + :_ `octs + [200 [['content-type' content-type] cache-header ~]] +:: +++ js +|% + ++ collapsible ^~ %- trip + ''' + function createCollapsible(el){ + console.log("creating collapsible") + const targetID = el.getAttribute("target"); + const targetEl = document.getElementById(targetID); + targetEl.classList.toggle("hide"); + let show = false; + el.addEventListener('click', () => { + console.log(show, "clicked on toggle") + console.log(targetID) + console.log(targetEl) + show = !show; + // el.classList.toggle("") TODO would need to toggle the button itself + targetEl.classList.toggle("not-hide") + targetEl.classList.toggle("hide") + }) + } + document.querySelectorAll(".toggle").forEach(createCollapsible) + console.log(document.querySelectorAll(".toggle")) + ''' +-- +++ payload-bail ^- simple-payload:http +%+ http-payload /text/plain 'Error' + +++ init +|* [=bowl:gall app-state=mold kaji-req=mold] +|% + +$ request + $% [%eyre p=eyre-order] + [%kaji tab=@t req=kaji-req] + == + +$ router $-([request bowl:gall app-state] kaji-res) + ++ route + |= [=router r=request state=app-state] + |^ ^- (list card:agent:gall) + ?- -.r + %eyre + =/ =req-line (parse-req req.p.r) + %+ send-eyre-res id.p.r + ?+ [pat ext]:req-line + :: default case + =/ resp (router r bowl state) + ?. ?=(%res -.resp) payload-bail + ?- +<.resp + %full p.resp + %page (http-payload /text/html (manx-to-cord .n (inject-head p.resp))) + %html (http-payload /text/html (manx-to-cord .y p.resp)) + %mime (http-payload type.resp p.resp) + %glob (glob-payload p.resp) + == + [[%session ~] [~ %js]] (http-payload /text/javascript docket-session-js) + [[%kaji-session ~] [~ %js]] (http-payload /text/javascript session-js) + [[%kaji ~] [~ %js]] (http-payload /text/javascript kaji-js) + [[%kaji ~] [~ %css]] (http-payload /text/css kaji-css) + + == + %kaji + =/ resp (router r bowl state) + ?. ?=(%sse -.resp) ~ :_ ~ + ?- -.wire.resp + %all (live-fact e.resp) + %tab (ui-fact tab.r e.resp) + %custom (give-fact p.wire.resp e.resp) + == + == + ++ inject-head + |= m=manx ^- manx + =/ sip (scow %p src.bowl) + =/ dap (trip dap.bowl) + =/ tags=marl :~ + ;link/"/kaji.css"(rel "stylesheet"); + ;script@"/kaji.js"; + ;script@"/kaji-session.js?ship={sip}&dap={dap}"; + == + |- + ?~ c.m m + ?: .=(%head n.g.i.c.m) + =. c.i.c.m (weld c.i.c.m tags) m + $(c.m t.c.m) + ++ docket-session-js ^~ + (rap 3 'window.ship = "' (rsh 3 (scot %p our.bowl)) '";' ~) + + ++ session-js ^~ %- crip + =/ ship (scow %p our.bowl) + =/ app (trip dap.bowl) + =/ live-ui "/ui" + """ + window.ship = '{ship}' + window.app = '{app}' + window.liveUI = '{live-ui}'; + """ + -- +-- +-- diff --git a/desk/lib/kaji.js b/desk/lib/kaji.js new file mode 100644 index 0000000..a37dada --- /dev/null +++ b/desk/lib/kaji.js @@ -0,0 +1,723 @@ + const tabId = `${Date.now()}${Math.floor(Math.random() * 100)}`; + const channelId = `kaji-${tabId}`; + const channelPath = `/~/channel/${channelId}`; + let channelMessageId = 0; + const parser = new DOMParser(); + + addEventListener('DOMContentLoaded', async () => { + await openChannel(); + scanElements(document); + handleDefaultScroll(); + }); + + function handleDefaultScroll(){ + const params = new URLSearchParams(window.location.search); + const goto = params.get('goto'); + if (goto) { + const target = document.getElementById(goto); + if (target) target.scrollIntoView({block: "center"}); + else (console.log(goto, "target not found")) + } + } + function insertAndScan(parent, htmlString){ + parent.innerHTML = htmlString; + scanElements(parent); + } + function scanElements(el){ + const isEl = el instanceof HTMLElement; + if (!el) return + const elements = el.querySelectorAll('[kaji]'); + if (isEl && el.getAttribute("kaji")) setListener(el); + elements.forEach(el => setListener(el)); + } + function loadScripts(el){ + const scripts = el.querySelectorAll("script"); + for (let scr of scripts){ + const newScript = document.createElement('script'); + if (scr.src) newScript.src = scr.src + else if (scr.textContent) newScript.textContent = scr.textContent + document.body.appendChild(newScript); + } + } + function setLocaleTime(el){ + const els = el.querySelectorAll(".locale-dt"); + for (let de of els){ + const timestamp = Number(de.textContent); + // TODO error handle the parsing + const date = new Date(timestamp); + // TODO set the format at the server + let localDate = ""; + if (de.classList.includes("time")) + localDate = date.toLocaleDateString(); + if (de.classList.includes("date")) + localDate = date.toLocaleTimeString(); + else localDate = date.toLocaleString(); + de.textContent = localDate; + } + + } + async function openChannel(){ + console.log(window.ship, "opening channel") + const sub1 = makeSubscribeBody(window.ship, window.app, window.liveUI); + const ssePath = `/sse/${tabId}`; + const sub2 = makeSubscribeBody(window.ship, window.app, ssePath); + const pok = makePokeBody(window.ship, "hood", "helm-hi", "hai") + const body = JSON.stringify([sub1, sub2, pok]) + await fetch(channelPath, { + method: 'PUT', + body + }); + eventSource = new EventSource(channelPath); + eventSource.addEventListener('message', handleChannelStream); + } + async function put(bodies){ + console.log({channelPath, bodies}, "put body") + const res = await fetch(channelPath, { + method: "PUT", + body: JSON.stringify(bodies) + }) + return await res + } + function subscribe(path){ + document.addEventListener('DOMContentLoaded', () => { + const sub = makeSubscribeBody(window.ship, window.app, path); + put([sub]) + }); + } + function handleChannelStream(e){ + const streamResponse = JSON.parse(e.data); + if (streamResponse.response !== 'diff') return; + sendAck(streamResponse.id) + const res = streamResponse.json; + if (!res || res?.length === 0) return; + for (let effect of res){ + console.log(effect, "sse command") + if ("refresh" in effect) clearBrowserCache() + if ("redi" in effect) redirect(effect.redi) + if ("focus" in effect) handleFocus(effect.focus) + if ("scroll" in effect) handleScroll(effect.scroll) + if ("url" in effect) updateURL(effect.url) + if ("custom" in effect) dispatchFact(effect.custom) + else { + const key = Object.keys(effect)[0]; + const htmlData = effect[key].manx; + const nel = parser.parseFromString(htmlData, 'text/html').body.firstChild; + if ("swap" in effect) swapTarget(null, nel, effect.swap.sel, effect.swap.inner); + if ("add" in effect) addEls(null, nel, effect.add.container, effect.add.where) + if ("modal" in effect) showModal(nel) + if ("alert" in effect) showAlert(nel, effect.alert.duration) + } + } + } + + function clearBrowserCache(){ + window.location.reload(true); + } + function handleFocus(sel){ + const el = document.querySelector(sel); + if (el) el.focus(); + } + function handleScroll(sel){ + const el = document.querySelector(sel); + if (el) el.scrollIntoView(); + } + function updateURL(url){ + window.history.pushState(null, null, url) + } + function redirect(url){ + // document.body.innerHTML = html; + // scanElements(document.body); + // history.pushState({}, '', url) + console.log(url, "redirecting") + window.location.href = url; + } + function dispatchFact(detail){ + const myCustomEvent = new CustomEvent("kaji-fact", { detail }); + document.dispatchEvent(myCustomEvent); + } + + function partialManx(newElement, selector){ + const existing = document.getElementById(newElement.id); + if (newElement && existing) + existing.parentNode.replaceChild(newElement, existing); + else { + const toReplace = document.querySelector(selector); + toReplace.parentNode.replaceChild(newElement, toReplace); + } + } + function addManx(newElement, selector){ + const container = document.getElementById(selector); + container.appendChild(newElement); + } + function wrapInModal(el){ + const background = document.createElement("div"); + background.id = "kaji-modal-bg"; + const foreground = document.createElement("div"); + foreground.id = "kaji-modal-fg"; + // Append modal content to modal + foreground.appendChild(el); + background.appendChild(foreground); + document.body.appendChild(background); + // Click outside to close + window.onclick = function(event) { + if (event.target == background) background.remove(); + } + } + function showModal(html){ + const background = document.createElement("div"); + background.id = "kaji-modal-bg"; + const foreground = document.createElement("div"); + foreground.id = "kaji-modal-fg"; + insertAndScan(foreground, html) + // Append modal content to modal + background.appendChild(foreground); + document.body.appendChild(background); + // Click outside to close + window.onclick = function(event) { + if (event.target == background) background.remove(); + } + } + function showAlert(element, duration){ + const div = document.createElement("div"); + div.id = "kaji-alert"; + div.appendChild(element); + document.body.appendChild(div); + setTimeout(() => document.body.removeChild(div), duration) + } + function passAttributes(parent, child){ + for (let attr of parent.attributes){ + const n = attr.name; + const v = attr.value; + if (n === "class" || n === "id") continue; + const haveIt = child.getAttribute(n); + if (v && !haveIt) child.setAttribute(n, v) + } + } + + function findForm(el){ + const is = isFormChild(el); + if (!is) return + let form; + let parent = el.parentElement; + while (!form){ + if (!parent) break; + passAttributes(parent, el) + const tag = parent.tagName.toLowerCase(); + if (tag === "form") form = parent; + else parent = parent.parentElement; + } + if (form) el.params = getFormData(form) + } + + function isFormChild(el){ + const tag = el.tagName.toLowerCase(); + return (tag === "input" + || tag === "select" + || tag === "option" + || tag === "textarea" + || tag === "button") + } + + function setListener(el){ + const kaji = el.getAttribute('kaji'); + // immediate calls + // we're not gonna bother with settings params here. + if (kaji === "mobile") fetchMobile(el) + else if (kaji === "fetch") fetchSource(el) + else if (kaji === "iscroll") infiniteScroll(el) + else if (kaji === "search") handleLiveSearch(el) + else if (kaji === "clickaway") clickaway(el) + // event listeners + else { + const trigger = el.getAttribute("trigger") || defaultTrigger(el); + el.addEventListener(trigger, (e) => { + routeKaji(e, el, kaji) + }) + } + } + + function routeKaji(e, el, kaji){ + + if (kaji === "navi") navigate(e, el) + if (kaji === "modal") mmodal(e, el) + if (kaji === "toggle") toggle(e, el) + if (kaji === "destroy") destroy(e, el) + // urbit stuff + if (kaji === "scry") scry2(e) + if (kaji === "watch") watch(e, el) + if (kaji === "poke") poke(e, el) + if (kaji === "thread") thread(e, el) + } + + function clickaway(el){ + window.onclick = function(event) { + if (el.contains(event.target)) return + else el.hidden = true; + } + } + + function destroy(e, el){ + e.stopPropagation(); + const targ = e.target.getAttribute("targ"); + if (!targ) return + const targs = targ.split("/").map(m => lookabove(e.target, m)); + for (let t of targs){ + if (t) t.parentElement.removeChild(t); + } + } + function bail(string){ + console.log(string) + return + } + function handleLiveSearch(el){ + const bounceSetting = el.getAttribute("bounce"); + const num = Number(bounceSetting || 0); + if (Number.isNaN(num)) return bail("bounce setting NaN"); + // + const debounce = (fn, delay) => { + let timeout; + return (...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => fn(...args), delay) + } + } + const handler = (e) => scry(e, el); + + const debounced = debounce(handler, num); + el.addEventListener("keyup", debounced); + } + + + function isNarrow(){ + return window.innerWidth < 768; // TODO + } + async function fetchMobile(el){ + const path = el.getAttribute('path'); + if (!isNarrow()) return + const res = await fetch(path); + const html = await res.text(); + const nel = parser.parseFromString(html, 'text/html').body.firstChild; + scanElements(nel); + el.replaceWith(nel); + } + async function fetchSource(el){ + const res = await fetch(el.getAttribute("src")); + const html = await res.text(); + const nel = parser.parseFromString(html, 'text/html').body.firstChild; + el.replaceWith(nel) + } + function infiniteScroll(el){ + let observer = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const spinner = replaceWithSpinner(entry.target); + const url = getURLwithParams(el); + routerScry(url).then(nel => { + if (!nel) return + const cont = entry.target.getAttribute("cont"); + // TODO + addEls(el, nel, cont, addWhere(el)) + dispatchScry({swapMode: "add", container: cont, element: nel}) + spinner.remove() + }); + observer.unobserve(entry.target); + } + }) + }); + observer.observe(el); + } + function replaceWithSpinner(el){ + const spinner = document.createElement("img"); + spinner.src = "spinner.svg"; + spinner.classList.add("iscroll-spinner") + el.replaceWith(spinner); + return spinner; + } + function handleError(res, el){ + if(!el) { + console.log(res, "No element found scrying") + return true + } + if (el.id === "kaji-alert") { + const dur = el.getAttribute("dur"); + const num = Number(dur); + showAlert(el, num); + return true + } + const err = el.getAttribute("kaji-error"); + if (!err) return false + showError(el); + return true + } + function showError(el){ + return + } + function lookabove(el, sel){ + console.log(el, "looking above") + console.log(sel, "sel") + if (!sel) { + console.log(sel, "selector not found") + return null + } + if (sel[0] === "#") return document.getElementById(sel.slice(1)); + if (!el) return null + const found = el.querySelector(sel); + if (!found) return lookabove(el.parentElement, sel) + else return found + } + function toggle(e, el){ + e.stopPropagation(); + const targ = e.target.getAttribute("targ"); + if (!targ) return + const targs = targ.split("/").map(m => lookabove(e.target, m)); + targs.forEach(t => { + if (e.target.getAttribute("modal")) wrapInModal(t); + if (t) t.hidden = !t.hidden + }) + + } + async function routerScry(path){ + console.log(path, "router scry") + const res = await fetch(path) + const html = await res.text() + const nel = parser.parseFromString(html, 'text/html').body.firstChild; + if (handleError(html, nel)) return null + scanElements(nel); + loadScripts(nel); + return nel + } + function dispatchScry(detail){ + const myCustomEvent = new CustomEvent("kaji-scry", { detail }); + document.dispatchEvent(myCustomEvent); + } + + function addWhere(el){ + const where = el.getAttribute("where") + if (!where) return { bottom: null } + if (where === "bottom") return { bottom: null } + if (where === "top") return { top: null } + if (where === "before") { + const sibling = el.getAttribute("sibling"); + if (!sibling) return null + else return { before: sibling } + } + else return null + } + function addEls(originEl, nel, selector, where){ + if (!where) bail("no where given to addEls") + const container = originEl + ? lookabove(originEl, selector) + : document.querySelector(selector); + if (!container) bail("no container given to addEls") + while (nel.firstChild){ + if ("top" in where) container.prepend(nel.firstChild) + else if ("bottom" in where) container.appendChild(nel.firstChild) + else if ("before" in where){ + const sibling = document.querySelector(where.before); + if (!sibling) bail ("sibling at addEls doesn't exist") + container.insertBefore(nel.firstChild, sibling); + } + } + } + + + function defaultTrigger(el){ + const tag = el.tagName.toLowerCase(); + if (tag === "form") return "submit" + if (tag === "input" || tag === "textarea" || tag === "select") return "change" + else return "click"; + } + function toggleIndicator(el, on){ + const indicator = el.getAttribute('indicator'); + const indEl = document.querySelector(indicator); + if (indEl) + indEl.style.display = on ? "block" : "none"; + } + + function getURLwithParams(el){ + findForm(el); + const spath = el.getAttribute("path"); + const path = spath || window.location.href; + // decide on priority when conflict + const current = new URLSearchParams(window.location.search); + const [pat, pars] = path.split("?"); + if (pars) { + const param = new URLSearchParams(pars); + for (let [k, v] of param.entries()){ + current.set(k, v) + } + } + const name = el.getAttribute("name"); + const params = el.params + ? el.params + : el.tagName === 'FORM' + ? getFormData(el) + : {}; + const second = new URLSearchParams(params); + const final = new URLSearchParams(); + for (let [k, v] of current.entries()){ + final.set(k, v) + } + if (name && el.value) final.set(name, el.value); + for (let [k, v] of second.entries()){ + final.set(k, v) + } + const url = `${pat}?${final.toString()}`; + return url + } + + function consolidateAttributes(el){ + let parent = el.parentElement; + while (parent){ + passAttributes(parent, el); + parent = parent.parentElement; + } + } + async function scry2(e){ + console.log(e, "scry event") + // this should go to kaji root + const el = e.target; + consolidateAttributes(el); + // + // this should go to url building function + const path = el.getAttribute("path") || window.location.href; + const params = new URLSearchParams(window.location.search); + const [pat, parString] = path.split("?"); + if (parString) { + const newParams = new URLSearchParams(parString); + for (let [k, v] of newParams.entries()){ + params.set(k, v) + } + } + const name = el.getAttribute("name"); + if (name) params.set(name, el.value); + const url = `${path}?${params.toString()}`; + // scry proper + e.preventDefault(); + const swapMode = el.getAttribute("swap") || "swap"; + toggleIndicator(el, true); + const nel = await routerScry(url); + console.log(nel, "nel") + if (!nel) return + const showParams = el.getAttribute("show-params"); + if (showParams) raiseParams(url); + let container; + if (swapMode === "swap"){ + toggleTab(el); + const target = el.getAttribute('targ') + const swhere = el.getAttribute('where'); + const where = !swhere ? true : (swhere === "inner") + container = swapTarget(el, nel, target, where) + } + else if (swapMode === "add"){ + const cont = el.getAttribute('cont') + container = await addEls(el, nel, cont, addWhere(el)); + } + toggleIndicator(el, false); + if (container) dispatchScry({swapMode, container}) + + + + } + async function scry(e, el){ + console.log(e, "scry event") + e.preventDefault(); + const url = getURLwithParams(el); + console.log(url, "url") + toggleIndicator(el, true); + const swapMode = el.getAttribute("swap"); + const nel = await routerScry(url); + if (!nel) return + const showParams = el.getAttribute("show-params"); + if (showParams) raiseParams(url); + let container; + if (swapMode === "swap"){ + toggleTab(el); + const target = el.getAttribute('targ') + const swhere = el.getAttribute('where'); + const where = !swhere ? true : (swhere === "inner") + container = swapTarget(el, nel, target, where) + } + else if (swapMode === "add"){ + const cont = el.getAttribute('cont') + container = await addEls(el, nel, cont, addWhere(el)); + } + toggleIndicator(el, false); + if (container) dispatchScry({swapMode, container}) + } + + function raiseParams(url){ + const params = url.split("?")[1] || ""; + const displayURL = `${window.location.pathname}?${params}`; + updateURL(displayURL) + } + + async function navigate(e, el){ + e.preventDefault(); + const path = el.getAttribute('path'); + const href = findAnchor(e.target); + const uri = path ? path : href; + if (!uri) throw new Error("no fetch path found") + const res = await fetch(uri); + const html = await res.text() + // If in a modal, replace the modal content with this + const modal = e.target.closest("#kaji-modal-fg"); + if (modal) insertAndScan(modal, html) + else insertAndScan(document.querySelector("body"), html); + } + function findAnchor(el){ + const a = el.closest("a"); + if (a) return a.href + else return null + } + async function mmodal(e, el){ + const path = el.getAttribute('path'); + const href = findAnchor(e.target); + const uri = path ? path : href; + if (!uri) throw new Error("no fetch path found") + const res = await fetch(uri); + const html = await res.text(); + showModal(html); + } + + function hasSetTarget(el){ + return !!el.attributes.targ + } + function toggleTab(el){ + if (!el.classList.contains("tab")) return; + const par = el.parentElement; + if (!el.classList.contains("active")){ + const curr = el.parentElement.querySelector(".active"); + curr.classList.remove("active"); + el.classList.add("active"); + } + } + function swapTarget(originEl, nel, targetSelector, inner){ + const domEL = originEl + ? lookabove(originEl, targetSelector) + : document.querySelector(targetSelector); + if (!domEL) { + console.log("no container", targetSelector) + return + } + if (inner){ + domEL.innerHTML = ''; + while (nel.firstChild){ + domEL.appendChild(nel.firstChild); + } + } else domEL.parentElement.replaceChild(nel, domEL) + return domEL + } + async function poke(e, el){ + e.preventDefault(); + const ship = el.getAttribute('ship'); + const app = el.getAttribute('app'); + const mark = el.getAttribute('mark') || 'kaji'; + const json = el.getAttribute('json'); + console.log(el.params, "poke params?") + + const tgt = e.currentTarget; + const button = tgt.tagName === 'FORM' + ? tgt.querySelector('input[type="submit"]') + : tgt; + // TODO add flag to configure this + button.disabled = true; + // wipe form + const action = tgt.getAttribute('action'); + const name = tgt.getAttribute("name"); + const payload = tgt.getAttribute('payload'); + // const value = payload ? payload : tgt.value; + const body = json ? json + : (tgt.tagName === 'FORM') + ? {action, ...getFormData(tgt)} + : action ? // if we set an action we send {action, name: value} + {action, [name]: payload} + : {action: name, [name]: payload}; + e.stopPropagation(); // this cancels currentTarget going up and up + if (tgt.tagName === 'FORM') wipeForm(tgt); + const b = {...body, origin: window.location.pathname, tab: tabId}; + console.log(b, "poke params") + const bodies = [makePokeBody(window.ship, window.app, mark, b)] + await put(bodies); + button.disabled = false + } + function wipeForm(form){ + const wipe = form.getAttribute("wipe"); + if (!wipe) return + const inputs = [ + ...form.getElementsByTagName("input"), + ...form.getElementsByTagName("textarea") + ]; + for (let input of inputs){ + if (input.type.toLowerCase() === 'text') input.value = ''; + if (input.tagName === "TEXTAREA") input.value = ''; + } + } + + function getFormData(form){ + const d = new FormData(form); + return Object.fromEntries(d) + } + + async function watch(e, el){ + const ship = el.getAttribute('ship'); + const app = el.getAttribute('app'); + const path = el.getAttribute('path'); + const body = makeSubscribeBody(ship, app, path); + return await fetch(channelPath, { + method: 'PUT', + body + }); + } + // threads don't support noun payloads yet + async function thread(e, el){ + console.log(el.params, "thread params?") + const desk = el.getAttribute('desk'); + const thread = el.getAttribute('thread'); + const inputMark = el.getAttribute('input-mark') || 'kaji'; + const outputMark = el.getAttribute('output-mark') || 'kaji'; + const noun = el.getAttribute('noun'); + + fetch(`/spider/${desk}/${inputMark}/${thread}/${outputMark}.kaji`, { + headers: { + 'Content-type': 'application/x-urb-jam' + }, + method: 'POST', + body: noun + }); + } + async function sendAck(id){ + return await fetch(channelPath, { + method: 'PUT', + body: makeAck(id) + }); + } + function makeSubscribeBody(ship, app, path) { + channelMessageId++; + return { + id: channelMessageId, + action: 'subscribe', + ship: ship.slice(1), // fucking tilde crap + app, + path + }; + }; + function makePokeBody(ship, app, mark, json) { + channelMessageId++; + return { + id: channelMessageId, + action: 'poke', + ship: ship.slice(1), // fucking tilde crap + app, + mark, + json + }; + }; + function makeAck(eventId) { + channelMessageId++; + return JSON.stringify([{ + id: channelMessageId, + action: 'ack', + "event-id": eventId + }]); + }; diff --git a/desk/lib/markdown.hoon b/desk/lib/markdown.hoon new file mode 100644 index 0000000..20e2fe5 --- /dev/null +++ b/desk/lib/markdown.hoon @@ -0,0 +1,699 @@ +/- tp=trill-post +|% +++ hi %hi +:: ++ parse +:: |= str=@t +:: ^- (unit (list block:tp)) +:: (rush str apex) +:: :: +:: +$ errata (each tape block:d) +:: +$ erratum +:: $% [%prose =tape] +:: [%line =tape] +:: [%br ~] +:: [%code =tape] +:: [%block =block:d] +:: == +:: +$ lang +:: $% [%p p=tape] :: prose +:: [%c p=tape] :: code +:: [%br ~] :: line break +:: == +:: ++ trace +:: |* [tag=@t sef=rule] +:: |= tub=nail +:: ?. dbug +:: (sef tub) +:: ~| [tag tub] +:: (sef tub) +:: ++ lyke +:: |$ [res] +:: [p=hair q=(unit [p=res q=nail])] +:: :: +:: ++ dbug & +:: ++ edict +:: |$ [prod] +:: $-(nail (like prod)) +:: :: +:: ++ rack +:: |* [los=tape sab=rule] +:: =+ vex=(sab [1 1] los) +:: ?~(q.vex ~ [~ u=p.u.q.vex]) +:: :: +:: ++ sing +:: |_ $: =nail +:: out=(list verse:d) +:: == +:: ++ sing . +:: ++ abet out +:: ++ bite +:: |= [txt=tape rul=(edict (list verse:d))] +:: ^- (unit (list verse:d)) +:: (rust txt rul) +:: ++ chew +:: |= rul=(edict (list verse:d)) +:: ^- [? _sing] +:: =/ tub (rul nail) +:: ?~ q.tub +:: ~? dbug failed-parsing/[tub nail] +:: [| sing] +:: =. nail q.u.q.tub +:: =. out (welp out p.u.q.tub) +:: [& sing] +:: ++ by-line +:: (more ret (star ;~(less ret next))) +:: ++ main +:: ^+ sing +:: %+ roll (scan q.nail by-line) +:: |= [txt=tape si=_sing] +:: ^+ si +:: =/ out out:si +:: ?: =(~ txt) +:: ?^ out +:: ?: ?=(%block -.i.out) si(out out) :: don't double space +:: => .(out `(list verse:d)`out) +:: si(out (snoc out inline/~[break/~])) +:: => .(out `(list verse:d)`out) +:: si(out (snoc out inline/~[break/~])) +:: ?^ bok=(rack txt hymn) +:: ~! bok +:: si(out (snoc out u.bok)) +:: =/ erratum=(list errata) +:: ~ +:: |- ^+ si +:: ?~ erratum si(out out) +:: ?: ?=(%| -.i.erratum) +:: $(erratum t.erratum, out (snoc out block/p.i.erratum)) +:: =^ inl si +:: abet:main:(abed:draw:si p.p.nail p.i.erratum) +:: $(out (snoc out inline/inl), erratum t.erratum) +:: :: +:: ++ hr (cold rule/~ (jest '---')) + +:: :: +:: ++ hymn +:: ^- (edict verse:d) +:: :: %+ cook (late ~) +:: %+ stag %block +:: ;~ pose +:: header-rul +:: hr +:: listing +:: == +:: :: +:: ++ listing +:: %+ cook +:: |= [mode=?(%ordered %unordered) ls=(list inline:d)] +:: ^- block:d +:: =/ item=listing:d [%item ls] +:: [%listing %list mode ~[item] ~] +:: =- ;~(pfix (star ace) -) +:: ;~ plug +:: ;~(pose (cold %ordered dem) (cold %unordered ;~(pose tar hep lus))) +:: :: +:: ^- (edict (list inline:d)) +:: |= n=^nail +:: =^ ine=(list inline:d) sing +:: abet:main:(abed:draw [p.p.nail q.n]) +:: ?: =(~ ine) +:: [p.nail ~] +:: [p.nail `[ine nail]] +:: == + +:: :: +:: ++ header-rul +:: %+ cook +:: |= [a=(list) b=(list inline:d)] +:: ^- block:d +:: =/ len (lent a) +:: =- [%header - b] +:: ?+ len !! :: forbidden by +stun +:: %1 %h1 +:: %2 %h2 +:: %3 %h3 +:: %4 %h4 +:: %5 %h5 +:: %6 %h6 +:: == +:: =- ;~(plug (stun [1 6] hax) -) +:: ^- (edict (list inline:d)) +:: |= n=_nail +:: =^ ine=(list inline:d) sing +:: abet:main:(abed:draw [p.p.nail q.n]) +:: ?: =(~ ine) +:: [p.nail ~] +:: [p.nail `[ine nail]] +:: ++ draw +:: |_ [mode=?(%normal %quote) inl=(list inline:d) nail=^nail] +:: ++ draw . +:: ++ abet +:: ?~ q.nail +:: [inl sing] +:: ~? dbug incomplete-parsing/nail +:: [inl sing] +:: ++ abed +:: |= [lin=@ud =tape] +:: draw(nail [[lin 1] tape]) +:: ++ peek +:: |= rul=(edict (list inline:d)) +:: ^- ? +:: =(~ q:(rul nail)) +:: ++ chew +:: |= rul=(edict (list inline:d)) +:: ^- [? _draw] +:: =/ tub (rul nail) +:: ?~ q.tub +:: ~? dbug failed-parsing/[tub nail] +:: [| draw] +:: =. nail q.u.q.tub +:: =. inl (welp inl p.u.q.tub) +:: [& draw] +:: ++ is-quote (peek (cold *(list inline:d) gar)) +:: ++ main +:: ^+ draw +:: =^ ok=? draw +:: (chew line) +:: ?: ok draw +:: =^ o=? draw +:: (chew raw-line) +:: ~| should-never-crash-fallback-parsing/nail +:: ?>(o draw) +:: ++ raw-line +:: (cook (cork crip (late ~)) (star next)) +:: :: +:: ++ line +:: %+ knee *(list inline:d) +:: |^ +:: |. ~+ +:: %- plus +:: ;~ pose +:: link +:: (stag %blockquote ;~(pfix gar line)) +:: :: (ifix [;~(plug tar tar) ;~(plug tar tar)] (stag %italics line)) +:: (parse-wrapped %italics ;~(plug tar tar)) +:: (parse-wrapped %bold tar) +:: code +:: ::(sear (ifix [tar tar] (stag %bold line))) +:: :: (parse-wrapped tar (stag %bold line)) +:: word +:: == +:: :: +:: ++ link +:: %+ cook +:: |= [con=tape src=tape] +:: ^- inline:d +:: [%link (crip src) (crip con)] +:: ;~ plug +:: (ifix [sel ser] (star ;~(less ser prn))) +:: (ifix [pal par] (star ;~(less par prn))) +:: == +:: ++ parse-wrapped +:: |* [tag=* delim=rule] +:: %+ stag tag +:: %+ sear fail-if-empty +:: (ifix [delim delim] line) +:: :: +:: ++ code +:: %+ stag %inline-code +:: %+ ifix [tic tic] +:: %+ cook crip +:: %- star +:: ;~(less tic prn) +:: -- +:: -- +:: -- +:: :: +:: ++ ran-hymn +:: |= str=tape +:: ^- verse:d +:: (scan str hymn:sing) +:: ++ ran +:: |= str=@t +:: ^- (list verse:d) +:: %- squeeze +:: abet:~(main sing [[1 1] (trip str)] ~) +:: ++ nixt +:: |= tub=nail +:: ^- (like char) +:: ?~ q.tub +:: (fail tub) +:: =+ zac=(lust i.q.tub p.tub) +:: ?: =('\\' i.q.tub) +:: ?~ t.q.tub +:: [zac [~ i.q.tub [zac t.q.tub]]] +:: =+ zec=(lust i.t.q.tub zac) +:: [zec [~ i.t.q.tub [zec t.t.q.tub]]] +:: [zac [~ i.q.tub [zac t.q.tub]]] +:: :: TODO: squeeze after parsing? +:: ++ migrate +:: |= [f=flag:d atom=@ud ls=(list content:post:gra:d)] +:: ^- (list verse:d) +:: =: flag f +:: time atom +:: == +:: %- squeeze +:: =< - +:: %+ roll ls +:: |= [con=content:post:gra:d out=(list verse:d) prev-break=_&] +:: ^- [(list verse:d) ?] +:: :_ ?=(?(%code %reference %url) -.con) +:: ?- -.con +:: %text (welp out (ring (trip text.con) prev-break)) +:: %mention (snoc out [%inline ~[ship/ship.con]]) :: TODO: i swear I PR'd ships +:: %code (snoc out [%inline ~[code/expression.con]]) +:: %reference (snoc out [%block (ref:nert:chat-graph reference.con)]) +:: :: +:: %url +:: =/ def=verse:d +:: [%inline ~[link/[url.con '']]] +:: %+ snoc out +:: ?~ ext=(rush url.con (cook rear (most dot (cook crip (plus ;~(less dot prn)))))) +:: def +:: ?. ?=(?(%png %jpeg %jpeg) u.ext) +:: def +:: [%block %image url.con 0 0 ''] +:: == +:: :: +:: ++ squeeze +:: |= ls=(list verse:d) +:: %- flop +:: %+ roll ls +:: |= [=verse:d out=(list verse:d)] +:: ^+ out +:: ?~ out [verse out] +:: ?- -.i.out +:: %inline +:: ?. ?=(%inline -.verse) [verse out] +:: :_(t.out [%inline (welp p.i.out p.verse)]) +:: :: +:: %block +:: ?. ?=(%block -.verse) [verse out] +:: (welp (flop (squeeze-lists verse i.out)) t.out) +:: == +:: :: +:: ++ squeeze-lists +:: |= [a=verse:d b=verse:d] +:: ^- (list verse:d) +:: ?. &(?=(%block -.a) ?=(%block -.b)) ~[a b] +:: ?. &(?=(%listing -.p.a) ?=(%listing -.p.b)) ~[a b] +:: ?. &(?=(%list -.p.p.a) ?=(%list -.p.p.b)) ~[a b] +:: ~! p.p.a +:: ?. =(p.p.p.a p.p.p.b) ~[a b] +:: =; =verse:d +:: ~[verse] +:: :- %block +:: :^ %listing %list +:: p.p.p.a +:: [(welp q.p.p.a q.p.p.a) (welp r.p.p.a r.p.p.b)] + +:: :: +:: ++ run-line +:: |= str=@t +:: ^- (list inline:d) +:: ~ +:: ++ apex (most (plus ret) block) +:: ++ ret +:: (jest '\0a\0a') +:: ++ para +:: ;~ pose +:: block +:: (stag %inline quote) +:: (stag %inline line) +:: == +:: ++ quote +:: (stag %blockquote (fzing (plus ;~(pfix gar line)))) +:: ++ block +:: %+ stag %block +:: ;~ pose +:: paragraph +:: blockquote +:: heading +:: media +:: codeblock +:: eval +:: tasklist +:: ref +:: == +:: :: +++ blockquote +;~ plug + (jest '> ') + +== +++ heading + %+ cook + |= [a=tape b=tape] + ^- block:tp + =/ len (lent a) + =/ h ?+ len %h6 + %1 %h1 + %2 %h2 + %3 %h3 + %4 %h4 + %5 %h5 + %6 %h6 + == + [%heading (crip b) h] + ;~(plug ;~(sfix (stun [1 6] hax) ace) (star next)) +++ lbr (just `@t`10) +++ word (star aln) +++ codeblock :: cf. +code + %+ cook |= [lang=tape code=tape] + ^- block:tp + [%codeblock (crip code) (crip lang)] + ;~ plug + ;~ sfix + ;~ pfix + (jest '```') + word + == + lbr + == + ;~ sfix + (star ;~(less (jest '\0a```') next)) + (jest '\0a```') + == + == +++ eval :: parse the hoon? +[%eval 'lol'] +:: ++ media :: would be cool to have syntax for image blocks +:: ;~ pfix +:: zap +:: link +:: == +++ link + %+ cook |= [alt=tape href=tape] ^- inline:tp + [%link (crip href) (crip alt)] + ;~ plug + (ifix [sel ser] (star ;~(less ser prn))) + (ifix [pal par] (plus ;~(less par prn))) + == + +:: :: +:: ++ hr +:: (jest '----') +:: :: +:: ++ word +:: (cook crip (plus ;~(less cab ret tar tic sel next))) +:: ++ fzing +:: |* rul=rule +:: (cook |*(a=(list) (zing a)) rul) +:: ++ listify +:: |* rul=rule +:: (cook |*(* ~[+<]) rul) +:: ++ fail-if-empty |=(a=(list inline:d) `(unit (list inline:d))`?:(=(~ a) ~ `a)) +:: :: +:: ++ line +:: %+ knee *(list inline:d) +:: |^ +:: |. ~+ +:: %- plus +:: ;~ pose +:: :: (ifix [;~(plug tar tar) ;~(plug tar tar)] (stag %italics line)) +:: (parse-wrapped %italics ;~(plug tar tar)) +:: (parse-wrapped %bold tar) +:: (parse-wrapped %italics cab) +:: code +:: ::(sear (ifix [tar tar] (stag %bold line))) +:: :: (parse-wrapped tar (stag %bold line)) +:: word +:: == +:: ++ parse-wrapped +:: |* [tag=* delim=rule] +:: %+ stag tag +:: %+ sear fail-if-empty +:: (ifix [delim delim] line) +:: :: +:: ++ code +:: %+ stag %inline-code +:: %+ ifix [tic tic] +:: %+ cook crip +:: %- star +:: ;~(less tic prn) +:: -- +:: ::: +:: ++ lin +:: |= txt=@t +:: ((plus ;~(less ret next)) [1 1] (trip txt)) +:: :: +:: ++ by-line +:: |= txt=tape +:: (split-rule txt ret) +:: :: +:: ++ log-fall +:: |* [tag=@ta str=tape a=(unit) b=*] +:: ?~ a +:: b +:: u.a +:: :: +:: ++ infix-lr +:: |* [left=rule right=rule inner=rule] +:: |= tub=nail +:: =+ vex=(left tub) +:: ?~ q.vex +:: (fail tub) +:: =/ but=nail tub +:: =+ outer=(;~(sfix (plus ;~(less right nixt)) (opt-sfix-end right)) q.u.q.vex) +:: ?~ q.outer +:: (fail tub) +:: =+ in=(inner [1 1] p.u.q.outer) +:: ?~ q.in +:: (fail tub) +:: outer(p.u.q p.u.q.in) +:: :: +:: ++ pose-further +:: |* [vex=edge sab=rule] +:: =+ roq=(sab) +:: ?: =(p.vex (last p.vex p.roq)) +:: vex +:: roq +:: :: +:: ++ infix +:: |* [delim=rule inner=rule] +:: |= tub=nail +:: =+ vex=(delim tub) +:: ?~ q.vex +:: (fail tub) +:: =/ but=nail tub +:: =+ outer=(;~(sfix (plus ;~(less delim nixt)) (opt-sfix-end delim)) q.u.q.vex) +:: ?~ q.outer +:: (fail tub) +:: =+ in=(inner [1 1] p.u.q.outer) +:: ?~ q.in +:: (fail tub) +:: outer(p.u.q p.u.q.in) :: +:: :: +:: ++ opt-sfix-end +:: |* sef=rule +:: |= tub=nail +:: ?: =(q.tub ~) +:: [p=p.tub q=[~ u=[p=~ q=tub]]] +:: =+ vex=(sef tub) +:: vex +:: :: +:: ++ infix-multi +:: |* inner=rule +:: |* [vex=edge delim=rule] +:: =/ roq +:: ?:(=(~ q.vex) (delim) vex) +:: ?~ q.roq :: did not find start delim, fail +:: [p=p.roq q=~] +:: =+ out=(;~(sfix (plus ;~(less delim next)) (opt-sfix-end delim)) q.u.q.roq) +:: ?~ q.out +:: [p=p.vex q=~] +:: =+ in=(inner [1 1] p.u.q.out) +:: ?~ q.in +:: [p=p.vex q=~] +:: [p=p.out q=[~ u=[p=p.u.q.in q=q.u.q.out]]] +:: :: +:: ++ infix-multi-bad +:: |* inner=rule +:: |= [vex=(lyke _(wonk (inner))) delim=$-(nail (lyke _(wonk (inner))))] +:: ^- (lyke _(wonk (inner))) +:: ?. ?=(~ q.vex) :: if success, ret +:: [p=p.vex q=~] +:: =+ roq=(delim) +:: ?~ q.roq :: did not find start delim, fail +:: [p=(last p.vex p.roq) q=q.roq] +:: ~! q.u.q.roq +:: =+ out=(;~(sfix (plus ;~(less delim next)) (opt-sfix-end delim)) q.u.q.roq) +:: ?~ q.out +:: [p=p.vex q=~] +:: =+ in=(inner [1 1] p.u.q.out) +:: ?~ q.in +:: [p=p.vex q=~] +:: [p=p.out q=[~ u=[p=p.u.q.in q=q.u.q.out]]] +:: :: +:: ++ split-rule +:: |* [txt=tape delim=rule] +:: ^- (list tape) +:: =- (log-fall %split-rule tape - [txt ~]) +:: (rust txt (more delim (star ;~(less delim next)))) +:: :: +:: ++ by-code +:: |^ +:: |= txt=tape +:: ^- (list lang) +:: (log-fall %by-code txt (rust txt (star apex)) ~[[%p txt]]) +:: :: (log-fall %by-code txt (rust txt (plus apex)) ~[[%& txt]]) +:: ++ apex +:: ;~ pose +:: code +:: prose-simple +:: (stag %p (listify next)) +:: == +:: ++ code +:: ;~ pose-further +:: (infix ;~(plug tic tic tic) code-inner) +:: (infix ;~(plug sig sig sig) code-inner) +:: == +:: ++ code-inner +:: (stag %c (star next)) +:: ++ prose-simple +:: (stag %p (plus ;~(less sig tic next))) +:: -- +:: :: +:: ++ elem +:: |% +:: ++ head +:: %+ cook +:: |= [a=(list) b=(list inline:d)] +:: ^- verse:d +:: =/ len (lent a) +:: =- [%block %header - b] +:: ?+ len !! :: forbidden by +stun +:: %1 %h1 +:: %2 %h2 +:: %3 %h3 +:: %4 %h4 +:: %5 %h5 +:: %6 %h6 +:: == +:: ;~(plug (stun [1 6] hax) inline) +:: ++ blockquote (stag %inline (listify (stag %blockquote ;~(pfix gar inline)))) +:: ++ hr (stag %block (cold `block:d`rule/~ (jest '---'))) +:: ++ str (tie (plus ;~(less cab tar tic sig sel nbsp nixt))) +:: ++ inline-verse (stag %inline inline) +:: ++ nbsp (jest ' ') +:: ++ inline +:: %+ knee *(list inline:d) +:: |. ~+ +:: %+ trace %inline +:: %- plus +:: ;~ pose +:: (stag %bold (infix ;~(plug cab cab) inline)) +:: (stag %bold (infix ;~(plug tar tar) inline)) +:: (stag %inline-code (infix tic code)) +:: (stag %italics (infix cab inline)) +:: (stag %italics (infix tar inline)) +:: (stag %ship ;~(pfix sig fed:ag)) +:: link +:: (cold ' ' (jest ' ')) +:: str +:: nixt +:: == +:: ++ link +:: %+ stag %link +:: %+ cook |=([a=@t b=@t] [b a]) +:: ;~ plug +:: (infix-lr sel ser (tie (star prn))) +:: (infix-lr pal par (tie (star prn))) +:: == +:: :: +:: ++ line-start +:: ^- (edict verse:d) +:: =- ;~(pfix (star whit) -) +:: ;~ pose +:: head +:: blockquote +:: hr +:: inline-verse +:: == +:: -- +:: :: +:: ++ code +:: (tie (star nixt)) +:: ++ tie +:: |* rul=rule +:: (cook crip rul) +:: :: +:: ++ whit ;~(pose (jest '\09') ace) +:: :: +:: ++ lift-blocks +:: |= [txt=tape prev-break=?] +:: ^- (list erratum) +:: =- (log-fall %lift-blocks txt - ~[prose/txt]) +:: %+ rust txt +:: %+ cook +:: |= ls=(list erratum) +:: ?~ ls ls +:: ?. prev-break ls +:: ?. ?=(%prose -.i.ls) +:: ls +:: [[%line tape.i.ls] t.ls] +:: %- plus +:: ;~ pose +:: %+ cook +:: |= [alt=tape src=tape] +:: ^- erratum +:: [%block [%image (crip src) 0 0 (crip alt)]] +:: =- ;~(pfix zap -) +:: ;~ plug +:: (ifix [sel ser] (star ;~(less ser prn))) +:: (ifix [pal par] (plus ;~(less par prn))) +:: == +:: :: +:: (stag %prose (plus ;~(less ;~(plug zap sel) prn))) +:: == +:: :: +:: ++ ring +:: |= [txt=tape last-break=?] +:: ^- (list verse:d) +:: =/ langs (by-code txt) +:: =/ lines=(list lang) +:: %- zing +:: %+ turn langs +:: |= =lang +:: ^- (list ^lang) +:: ?. ?=(%p -.lang) +:: ~[lang] +:: =/ ls=(list ^lang) (turn (by-line p.lang) (lead %p)) +:: =/ sep=^lang br/~ +:: (join sep ls) +:: =/ err=(list erratum) +:: =< - +:: %+ roll lines +:: |= [=lang out=(list erratum) prev-break=_last-break] +:: ^- [(list erratum) ?] +:: :_ =(%br -.lang) +:: ?: ?=(%c -.lang) +:: (snoc out [%code p.lang]) +:: ?: ?=(%br -.lang) +:: (snoc out br/~) +:: (welp out (lift-blocks p.lang prev-break)) +:: =/ blocks=(list verse:d) +:: %+ turn err +:: |= e=erratum +:: ^- verse:d +:: ?- -.e +:: %br [%inline ~[break/~]] +:: :: +:: %code [%inline ~[code/(crip tape.e)]] +:: %block [%block block.e] +:: :: +:: %prose +:: =/ def=verse:d [%inline ~[(crip tape.e)]] +:: =- (log-fall %prose-verse tape.e - def) +:: (rust tape.e inline-verse:elem) +:: :: +:: %line +:: =/ def=verse:d [%inline ~[(crip tape.e)]] +:: =; =verse:d +:: ?: ?=(%inline -.verse) +:: [%inline break/~ p.verse] +:: verse +:: =- (log-fall %line-verse tape.e - def) +:: (rust tape.e line-start:elem) +:: == +:: (squeeze blocks) +-- diff --git a/desk/lib/mast.hoon b/desk/lib/mast.hoon new file mode 100644 index 0000000..74636e8 --- /dev/null +++ b/desk/lib/mast.hoon @@ -0,0 +1,694 @@ +:: :: :: :: +:: +:: Mast - a Sail framework +:: +:: [v.1.0.1] +:: +:: +:: This library contains a system for building fully dynamic Sail front-ends +:: where all front-end app state and the current state of the display itself +:: live on your ship. +:: +:: A small script that is generic to any application is inserted into your Sail +:: and used to establish an Eyre channel, receive display updates from your ship, +:: and to sync the browser with them. +:: +:: Events on the browser are handled completely within your ship, +:: without the need to write a single line of JavaScript. +:: You may describe event listeners in your Sail components with attributes like this: +:: =event "/click/..." +:: The first segment of the path is the event listener name, +:: with further segments defining an arbitrary endpoint for an event handler on your agent. +:: Events are sent as pokes under a json mark, which can be parsed with the library. +:: You may also return data from the event like this: +:: =return "/target/value" +:: The first segment is the object to return data from, and the second is the property to return. +:: Data can be returned from the target element, event object, or any other element associated by id. +:: +:: When the display state changes as a result of events initiated on the browser, +:: or from any other kind of event in the agent, updates to the browser containing +:: only the necessary amount of html to achieve this state are sent and swapped in. +:: +:: +:: The server section contains all of the arms for usage in your app. +:: Rig, plank, and gust are the main arms. See the description of these arms below. +:: +:: For more details visit: https://github.com/R-JG/mast +:: +:: :: :: :: +|% ++$ view manx ++$ yard [url=path sail=gate] ++$ yards (list yard) ++$ parsed-req [tags=path data=(map @t @t)] +:: :: :: :: +:: +:: Server +:: +:: :: :: :: +:: +:: - The rig arm is used to produce a new instance of the display state. +:: - "yards" is the list of your app's routes, each corresponding to a root level Sail component +:: (i.e. a complete document with html, head, and body tags). +:: - "url" is either the request url from Eyre in the context of a direct http request, +:: or the current url (this should be saved in state). +:: - "app-state" represents the total sample for each of your root level Sail components +:: (currently, root level Sail components in yards each need to take the same sample). +:: - Rig uses the url to select the matching yard and renders its Sail component. +:: - The newly produced display state should then be used with either plank or gust, +:: and saved as the current display state in the agent. +:: +++ rig + |* [=yards url=path app-state=*] + ^- view + ?~ yards + (adky (manx sail-404)) + =/ yurl=path url.i.yards + ?: |- + ?~ url + %.n + ?~ yurl + %.n + ?. |(=(i.url i.yurl) =(%$ i.yurl)) + %.n + ?: &(=(~ t.url) =(~ t.yurl)) + %.y + $(url t.url, yurl t.yurl) + =/ rigd (adky (manx (sail.i.yards app-state))) + rigd(a.g (mart [[%url (path <url>)] a.g.rigd])) + $(yards t.yards) +:: +:: - The plank arm is used for serving whole pages in response to %handle-http-request pokes, +:: acting as the first point of contact for the app. +:: - Plank needs to take some basic information about the page that you are serving: +:: - "app" is the name of the app, +:: - "sub" is the subscription path that the client will subscribe to for receiving display updates, +:: - "ship" is your patp, +:: - "rid" is the Eyre id from the %handle-http-request poke, +:: - "new" is the newly rendered display state produced with rig. +:: - Plank produces a list of cards serving the http response. +:: +++ plank + |= [app=tape sub=path ship=@p rid=@ta new=view] + ^- (list card:agent:gall) + ?~ c.new !! + %^ make-direct-http-cards rid + [200 ['Content-Type' 'text/html'] ~] + :- ~ + ^- octs + %- as-octt:mimes:html + %- en-xml:html + ^- manx + %= new + a.g %- mart :^ + [%app app] + [%path <(path sub)>] + [%ship +:(scow %p ship)] + a.g.new + c.i.c (marl [script-node c.i.c.new]) + == +:: +:: - The gust arm is used for producing a set of display updates for the browser, +:: used typically after making changes to your app's state, and rendering new display data with rig. +:: - "sub" is the subscription path that was sent initially in plank, where gust will send the updates. +:: - "old" is the display state that is currently saved in your agent's state, +:: produced some time previously by rig. +:: - "new" is the new display data to be produced with rig just before gust gets used. +:: - Gust can be used anywhere you'd make a subscription update (in contrast to plank). +:: - Gust produces a single card. +:: +++ gust + |= [sub=path old=view new=view] + ^- card:agent:gall + ?~ c.old !! + ?~ c.new !! + ?~ t.c.old !! + ?~ t.c.new !! + ?~ a.g.new !! + :^ %give %fact ~[sub] + :- %json + !> %- tape:enjs:format + %- en-xml:html + ^- manx + ;g + =url v.i.a.g.new + ;* %+ algo + c.i.t.c.old + c.i.t.c.new + == +:: +++ parse-json + |= j=json + ^- parsed-req + %- (ot ~[tags+pa data+(om so)]):dejs:format j +:: +++ parse-url + |= url=@t + ^- path + %- paru (trip url) +:: +++ make-css-response + |= [rid=@ta css=@t] + ^- (list card:agent:gall) + %^ make-direct-http-cards rid + [200 ['Content-Type' 'text/css'] ~] + [~ (as-octs:mimes:html css)] +:: +++ make-auth-redirect + |= rid=@ta + ^- (list card:agent:gall) + %^ make-direct-http-cards rid + [307 ['Location' '/~/login?redirect='] ~] ~ +:: +++ make-400 + |= rid=@ta + ^- (list card:agent:gall) + %^ make-direct-http-cards + rid [400 ~] ~ +:: +++ make-404 + |= [rid=@ta data=(unit octs)] + ^- (list card:agent:gall) + %^ make-direct-http-cards + rid [404 ~] data +:: +++ make-direct-http-cards + |= [rid=@ta head=response-header.simple-payload:http data=(unit octs)] + ^- (list card:agent:gall) + :~ [%give %fact ~[/http-response/[rid]] [%http-response-header !>(head)]] + [%give %fact ~[/http-response/[rid]] [%http-response-data !>(data)]] + [%give %kick ~[/http-response/[rid]] ~] + == +:: :: :: :: +:: +:: Algorithms +:: +:: :: :: :: +++ algo + |= [old=marl new=marl] + ^- marl + =/ i=@ud 0 + =/ acc=marl ~ + |- + ?~ new + ?. =(~ old) + ?: =(%skip -.-.-.old) + $(old +.old) + :_ acc + :_ ~ + :- %d + =/ c=@ud 0 + |- ^- mart + ?~ old + ~ + :- :- (crip (weld "d" <c>)) + (getv a.g.i.old %key) + $(old t.old, c +(c)) + acc + ?: &(?=(^ old) =(%skip -.-.-.old)) + $(old t.old) + ?: =(%m n.g.i.new) + $(new t.new, i +(i), acc (snoc acc i.new)) + =/ j=@ud 0 + =/ jold=marl old + =/ nkey=[n=mane k=tape] [n.g.i.new (getv a.g.i.new %key)] + |- + ?~ new + !! + ?~ jold + %= ^$ + new t.new + i +(i) + acc %+ snoc acc + ;n(id <i>) + ;+ i.new + == + == + ?~ old + !! + ?: =(%skip n.g.i.jold) + $(jold t.jold, j +(j)) + ?: .=(nkey [n.g.i.jold (getv a.g.i.jold %key)]) + ?. =(0 j) + =/ n=@ud 0 + =/ nnew=marl new + =/ okey=[n=mane k=tape] [n.g.i.old (getv a.g.i.old %key)] + |- + ?~ nnew + ^^$(old (snoc t.old i.old)) + ?: =(%m n.g.i.nnew) + $(nnew t.nnew, n +(n)) + =/ nnky=[n=mane k=tape] [n.g.i.nnew (getv a.g.i.nnew %key)] + ?. .=(okey nnky) + $(nnew t.nnew, n +(n)) + ?: (gte n j) + =/ aupd=mart (upda a.g.i.old a.g.i.nnew) + ?~ aupd + %= ^^$ + old c.i.old + new c.i.nnew + i 0 + acc + %= ^^$ + old t.old + new %^ newm new n + ;m(id <(add n i)>, key k.nnky); + == + == + %= ^^$ + old c.i.old + new c.i.nnew + i 0 + acc + %= ^^$ + old t.old + new %^ newm new n + ;m(id <(add n i)>, key k.nnky); + acc :_ acc + [[%c [[%key k.nnky] aupd]] ~] + == + == + =/ aupd=mart (upda a.g.i.jold a.g.i.new) + ?~ aupd + %= ^^$ + old c.i.jold + new c.i.new + i 0 + acc + %= ^^$ + old (newm old j ;skip;) + new t.new + i +(i) + acc %+ snoc acc + ;m(id <i>, key k.nkey); + == + == + %= ^^$ + old c.i.jold + new c.i.new + i 0 + acc + %= ^^$ + old (newm old j ;skip;) + new t.new + i +(i) + acc :- [[%c [[%key k.nkey] aupd]] ~] + %+ snoc + acc + ;m(id <i>, key k.nkey); + == + == + ?: =("text" (getv a.g.i.new %mast)) + ?: =(+.-.+.-.-.+.-.old +.-.+.-.-.+.-.new) + ^$(old t.old, new t.new, i +(i)) + %= ^$ + old t.old + new t.new + i +(i) + acc [i.new acc] + == + =/ aupd=mart (upda a.g.i.old a.g.i.new) + ?~ aupd + %= ^$ + old c.i.old + new c.i.new + i 0 + acc ^$(old t.old, new t.new, i +(i)) + == + %= ^$ + old c.i.old + new c.i.new + i 0 + acc + %= ^$ + old t.old + new t.new + i +(i) + acc :_ acc + [[%c [[%key k.nkey] aupd]] ~] + == + == + $(jold t.jold, j +(j)) +:: +++ adky + |= root=manx + |^ ^- manx + (tanx root "0" "~") + ++ tanx + |= [m=manx key=tape pkey=tape] + =/ fkey=tape (getv a.g.m %key) + =/ nkey=tape ?~(fkey key fkey) + ?: =(%$ n.g.m) + ;span + =mast "text" + =key nkey + =pkey pkey + ;+ m + == + =: a.g.m %- mart + ?~ fkey + [[%key nkey] [[%pkey pkey] a.g.m]] + [[%pkey pkey] a.g.m] + c.m (tarl c.m nkey) + == + m + ++ tarl + |= [m=marl key=tape] + =/ i=@ud 0 + |- ^- marl + ?~ m + ~ + :- %^ tanx + (manx i.m) + (weld (scow %ud i) (weld "-" key)) + key + $(m t.m, i +(i)) + -- +:: +++ getv + |= [m=mart tag=@tas] + ^- tape + ?~ m + ~ + ?: =(n.i.m tag) + v.i.m + $(m t.m) +:: +++ upda + |= [om=mart nm=mart] + =/ acc=mart ~ + |- ^- mart + ?~ nm + ?~ om + acc + :_ acc + :- %rem + =/ omom=mart om + |- + ?~ omom + ~ + =/ nom=tape +:<n.i.omom> + |- + ?~ nom + [' ' ^$(omom t.omom)] + [i.nom $(nom t.nom)] + =/ i=@ud 0 + =/ com=mart om + |- + ?~ nm + !! + ?~ com + ^$(nm t.nm, acc [i.nm acc]) + ?~ om + !! + ?: =(n.i.com n.i.nm) + ?: =(v.i.com v.i.nm) + ^$(om (oust [i 1] (mart om)), nm t.nm) + %= ^$ + om (oust [i 1] (mart om)) + nm t.nm + acc [i.nm acc] + == + $(com t.com, i +(i)) +:: +++ newm + |= [ml=marl i=@ud mx=manx] + =/ j=@ud 0 + |- ^- marl + ?~ ml + ~ + :- ?: =(i j) + mx + i.ml + $(ml t.ml, j +(j)) +:: +++ paru + |= turl=tape + ^- path + =/ tacc=tape ~ + =/ pacc=path ~ + |- + ?~ turl + ?~ tacc + pacc + (snoc pacc (crip tacc)) + ?: =('/' i.turl) + ?~ tacc + $(turl t.turl) + %= $ + turl t.turl + tacc ~ + pacc (snoc pacc (crip tacc)) + == + $(turl t.turl, tacc (snoc tacc i.turl)) +:: :: :: :: +:: +:: Sail +:: +:: :: :: :: +++ script-node + ^- manx + ;script + ;+ ;/ script + == +++ sail-404 + ^- manx + ;html + ;head + ;meta(charset "utf-8"); + == + ;body + ;span: 404 + == + == +:: :: :: :: +:: +:: Script +:: +:: :: :: :: +++ script + ^~ + %- trip + ''' + let ship; + let app; + let displayUpdatePath; + let channelMessageId = 0; + let eventSource; + const channelId = `${Date.now()}${Math.floor(Math.random() * 100)}`; + const channelPath = `${window.location.origin}/~/channel/${channelId}`; + addEventListener('DOMContentLoaded', async () => { + ship = document.documentElement.getAttribute('ship'); + app = document.documentElement.getAttribute('app'); + displayUpdatePath = document.documentElement.getAttribute('path'); + await connectToShip(); + let eventElements = document.querySelectorAll('[event]'); + eventElements.forEach(el => setEventListeners(el)); + }); + function setEventListeners(el) { + const eventTags = el.getAttribute('event'); + const returnTags = el.getAttribute('return'); + eventTags.split(/\s+/).forEach(eventStr => { + const eventType = eventStr.split('/', 2)[1]; + el[`on${eventType}`] = (e) => pokeShip(e, eventStr, returnTags); + }); + }; + async function connectToShip() { + try { + const storageKey = `${ship}${app}${displayUpdatePath}`; + let storedId = localStorage.getItem(storageKey); + localStorage.setItem(storageKey, channelId); + if (storedId) { + const delPath = `${window.location.origin}/~/channel/${storedId}`; + await fetch(delPath, { + method: 'PUT', + body: JSON.stringify([{ + id: channelMessageId, + action: 'delete' + }]) + }); + }; + const body = JSON.stringify(makeSubscribeBody()); + await fetch(channelPath, { + method: 'PUT', + body + }); + eventSource = new EventSource(channelPath); + eventSource.addEventListener('message', handleChannelStream); + } catch (error) { + console.error(error); + }; + }; + function pokeShip(event, tagString, dataString) { + try { + let data = {}; + if (dataString) { + const dataToReturn = dataString.split(/\s+/); + dataToReturn.forEach(dataTag => { + let splitDataTag = dataTag.split('/'); + if (splitDataTag[0] === '') splitDataTag.shift(); + const kind = splitDataTag[0]; + const key = splitDataTag.pop(); + if (kind === 'event') { + if (!(key in event)) { + console.error(`Property: ${key} does not exist on the event object`); + return; + }; + data[dataTag] = String(event[key]); + } else if (kind === 'target') { + if (!(key in event.currentTarget)) { + console.error(`Property: ${key} does not exist on the target object`); + return; + }; + data[dataTag] = String(event.currentTarget[key]); + } else { + const elementId = splitDataTag.join('/'); + const linkedEl = document.getElementById(elementId); + if (!linkedEl) { + console.error(`No element found for id: ${kind}`); + return; + }; + if (!(key in linkedEl)) { + console.error(`Property: ${key} does not exist on the object with id: ${elementId}`); + return; + }; + data[dataTag] = String(linkedEl[key]); + }; + }); + }; + fetch(channelPath, { + method: 'PUT', + body: JSON.stringify(makePokeBody({ + tags: tagString, + data + })) + }); + } catch (error) { + console.error(error); + }; + }; + function handleChannelStream(event) { + try { + const streamResponse = JSON.parse(event.data); + if (streamResponse.response !== 'diff') return; + fetch(channelPath, { + method: 'PUT', + body: JSON.stringify(makeAck(streamResponse.id)) + }); + const htmlData = streamResponse.json; + if (!htmlData) return; + let container = document.createElement('template'); + container.innerHTML = htmlData; + if (container.content.firstElementChild.childNodes.length === 0) return; + const navUrl = container.content.firstElementChild.getAttribute('url'); + if (navUrl && (navUrl !== window.location.pathname)) { + history.pushState({}, '', navUrl); + }; + while (container.content.firstElementChild.children.length > 0) { + let gustChild = container.content.firstElementChild.firstElementChild; + if (gustChild.tagName === 'D') { + for (const att of gustChild.attributes) { + const dkey = att.value; + document.querySelector(`[key="${dkey}"]`).remove(); + }; + gustChild.remove(); + } else if (gustChild.tagName === 'N') { + const nodeKey = gustChild.firstElementChild.getAttribute('key'); + const parentKey = gustChild.firstElementChild.getAttribute('pkey'); + const appendIndex = gustChild.id; + let domParent = document.querySelector(`[key="${parentKey}"]`); + domParent.insertBefore(gustChild.firstElementChild, domParent.children[appendIndex]); + let appendedChild = domParent.querySelector(`[key="${nodeKey}"]`); + if (appendedChild.getAttribute('event')) { + setEventListeners(appendedChild); + }; + if (appendedChild.childElementCount > 0) { + let needingListeners = appendedChild.querySelectorAll('[event]'); + needingListeners.forEach(child => setEventListeners(child)); + }; + appendedChild = appendedChild.nextElementSibling; + gustChild.remove(); + } else if (gustChild.tagName === 'M') { + const nodeKey = gustChild.getAttribute('key'); + const nodeIndex = gustChild.id; + let existentNode = document.querySelector(`[key="${nodeKey}"]`); + let childAtIndex = existentNode.parentElement.children[nodeIndex]; + if (existentNode.nextElementSibling + && (existentNode.nextElementSibling.getAttribute('key') + === childAtIndex.getAttribute('key'))) { + existentNode.parentElement.insertBefore(existentNode, childAtIndex.nextElementSibling); + } else { + existentNode.parentElement.insertBefore(existentNode, childAtIndex); + }; + gustChild.remove(); + } else if (gustChild.tagName === 'C') { + const nodeKey = gustChild.getAttribute('key'); + const attToRem = gustChild.getAttribute('rem')?.slice(0, -1).split(' ') ?? []; + let existentNode = document.querySelector(`[key="${nodeKey}"]`); + attToRem.forEach(att => { + if (att === 'event') { + const eventType = existentNode.getAttribute('event').split('/', 2)[1]; + existentNode[`on${eventType}`] = null; + }; + existentNode.removeAttribute(att); + }); + gustChild.removeAttribute('key'); + gustChild.removeAttribute('rem'); + for (const att of gustChild.attributes) { + existentNode.setAttribute(att.name, att.value); + if (att.name === 'event') { + const eventType = existentNode.getAttribute('event').split('/', 2)[1]; + existentNode[`on${eventType}`] = null; + setEventListeners(existentNode); + }; + }; + gustChild.remove(); + } else { + const nodeKey = gustChild.getAttribute('key'); + let existentNode = document.querySelector(`[key="${nodeKey}"]`); + existentNode.replaceWith(gustChild); + let replacedNode = document.querySelector(`[key="${nodeKey}"]`); + if (replacedNode.getAttribute('event')) { + setEventListeners(replacedNode); + }; + if (replacedNode.childElementCount > 0) { + let needingListeners = replacedNode.querySelectorAll('[event]'); + needingListeners.forEach(child => setEventListeners(child)); + }; + }; + }; + } catch (error) { + console.error(error); + }; + }; + function makeSubscribeBody() { + channelMessageId++; + return [{ + id: channelMessageId, + action: 'subscribe', + ship: ship, + app: app, + path: displayUpdatePath + }]; + }; + function makePokeBody(jsonData) { + channelMessageId++; + return [{ + id: channelMessageId, + action: 'poke', + ship: ship, + app: app, + mark: 'json', + json: jsonData + }]; + }; + function makeAck(eventId) { + channelMessageId++; + return [{ + id: channelMessageId, + action: 'ack', + "event-id": eventId + }]; + }; + ''' +--
\ No newline at end of file diff --git a/desk/lib/mmast.hoon b/desk/lib/mmast.hoon new file mode 100644 index 0000000..319c201 --- /dev/null +++ b/desk/lib/mmast.hoon @@ -0,0 +1,693 @@ + +:: :: :: :: +:: +:: Mast - a Sail framework +:: +:: [v.1.0.1] +:: +:: +:: This library contains a system for building fully dynamic Sail front-ends +:: where all front-end app state and the current state of the display itself +:: live on your ship. +:: +:: A small script that is generic to any application is inserted into your Sail +:: and used to establish an Eyre channel, receive display updates from your ship, +:: and to sync the browser with them. +:: +:: Events on the browser are handled completely within your ship, +:: without the need to write a single line of JavaScript. +:: You may describe event listeners in your Sail components with attributes like this: +:: =event "/click/..." +:: The first segment of the path is the event listener name, +:: with further segments defining an arbitrary endpoint for an event handler on your agent. +:: Events are sent as pokes under a json mark, which can be parsed with the library. +:: You may also return data from the event like this: +:: =return "/target/value" +:: The first segment is the object to return data from, and the second is the property to return. +:: Data can be returned from the target element, event object, or any other element associated by id. +:: +:: When the display state changes as a result of events initiated on the browser, +:: or from any other kind of event in the agent, updates to the browser containing +:: only the necessary amount of html to achieve this state are sent and swapped in. +:: +:: +:: The server section contains all of the arms for usage in your app. +:: Rig, plank, and gust are the main arms. See the description of these arms below. +:: +:: For more details visit: https://github.com/R-JG/mast +:: +:: :: :: :: +|% ++$ sail-gate $-([app-state=* =bowl:gall] manx) ++$ router $-(path sail-gate) ++$ parsed-req [tags=path data=(map @t @t)] +:: :: :: :: +:: +:: Server +:: +:: :: :: :: +:: +:: - The rig arm is used to produce a new instance of the display state. +:: - "yards" is the list of your app's routes, each corresponding to a root level Sail component +:: (i.e. a complete document with html, head, and body tags). +:: - "url" is either the request url from Eyre in the context of a direct http request, +:: or the current url (this should be saved in state). +:: - "app-state" represents the total sample for each of your root level Sail components +:: (currently, root level Sail components in yards each need to take the same sample). +:: - Rig uses the url to select the matching yard and renders its Sail component. +:: - The newly produced display state should then be used with either plank or gust, +:: and saved as the current display state in the agent. +:: +++ rig + |* [=router url=path app-state=* =bowl:gall] + ^- manx + =/ sail (router url) + (sail app-state bowl) +:: +:: - The plank arm is used for serving whole pages in response to %handle-http-request pokes, +:: acting as the first point of contact for the app. +:: - Plank needs to take some basic information about the page that you are serving: +:: - "app" is the name of the app, +:: - "sub" is the subscription path that the client will subscribe to for receiving display updates, +:: - "ship" is your patp, +:: - "rid" is the Eyre id from the %handle-http-request poke, +:: - "new" is the newly rendered display state produced with rig. +:: - Plank produces a list of cards serving the http response. +:: +:: ++ plank +:: |= [eyre-id=@ta m=manx =bowl:gall] +:: ^- (list card:agent:gall) +:: %^ make-direct-http-cards eyre-id +:: [200 ['Content-Type' 'text/html'] ~] +:: :- ~ +:: ^- octs +:: %- as-octt:mimes:html +:: %- en-xml:html +:: ^- manx +:: %= m +:: a.g %- mart :^ +:: [%app (trip dap.bowl)] +:: [%path "/ui"] +:: [%ship (scow %p our.bowl)] +:: a.g.m +:: c.i.c (marl [script-node c.i.c.m]) +:: == +:: +:: - The gust arm is used for producing a set of display updates for the browser, +:: used typically after making changes to your app's state, and rendering new display data with rig. +:: - "sub" is the subscription path that was sent initially in plank, where gust will send the updates. +:: - "old" is the display state that is currently saved in your agent's state, +:: produced some time previously by rig. +:: - "new" is the new display data to be produced with rig just before gust gets used. +:: - Gust can be used anywhere you'd make a subscription update (in contrast to plank). +:: - Gust produces a single card. +:: +++ gast + |= [old=manx new=manx] + ?~ c.old !! + ?~ c.new !! + ?~ t.c.old !! + ?~ t.c.new !! + ?~ a.g.new !! + ^- manx + ;g + =url v.i.a.g.new + ;* %+ algo + c.i.t.c.old + c.i.t.c.new + == +:: ++ gust +:: |= [old=manx new=manx] +:: ^- card:agent:gall +:: ?~ c.old !! +:: ?~ c.new !! +:: ?~ t.c.old !! +:: ?~ t.c.new !! +:: ?~ a.g.new !! +:: :^ %give %fact /ui +:: :- %json +:: !> %- tape:enjs:format +:: %- en-xml:html +:: ^- manx +:: ;g +:: =url v.i.a.g.new +:: ;* %+ algo +:: c.i.t.c.old +:: c.i.t.c.new +:: == +:: +++ parse-json + |= j=json + ^- parsed-req + %- (ot ~[tags+pa data+(om so)]):dejs:format j +:: +++ parse-url + |= url=@t + ^- path + %- paru (trip url) +:: +++ make-css-response + |= [rid=@ta css=@t] + ^- (list card:agent:gall) + %^ make-direct-http-cards rid + [200 ['Content-Type' 'text/css'] ~] + [~ (as-octs:mimes:html css)] +:: +++ make-auth-redirect + |= rid=@ta + ^- (list card:agent:gall) + %^ make-direct-http-cards rid + [307 ['Location' '/~/login?redirect='] ~] ~ +:: +++ make-400 + |= rid=@ta + ^- (list card:agent:gall) + %^ make-direct-http-cards + rid [400 ~] ~ +:: +++ make-404 + |= [rid=@ta data=(unit octs)] + ^- (list card:agent:gall) + %^ make-direct-http-cards + rid [404 ~] data +:: +++ make-direct-http-cards + |= [rid=@ta head=response-header.simple-payload:http data=(unit octs)] + ^- (list card:agent:gall) + :~ [%give %fact ~[/http-response/[rid]] [%http-response-header !>(head)]] + [%give %fact ~[/http-response/[rid]] [%http-response-data !>(data)]] + [%give %kick ~[/http-response/[rid]] ~] + == +:: :: :: :: +:: +:: Algorithms +:: +:: :: :: :: +++ algo + |= [old=marl new=marl] + ^- marl + =/ i=@ud 0 + =/ acc=marl ~ + |- + ?~ new + ?. =(~ old) + ?: =(%skip -.-.-.old) + $(old +.old) + :_ acc + :_ ~ + :- %d + =/ c=@ud 0 + |- ^- mart + ?~ old + ~ + :- :- (crip (weld "d" <c>)) + (getv a.g.i.old %key) + $(old t.old, c +(c)) + acc + ?: &(?=(^ old) =(%skip -.-.-.old)) + $(old t.old) + ?: =(%m n.g.i.new) + $(new t.new, i +(i), acc (snoc acc i.new)) + =/ j=@ud 0 + =/ jold=marl old + =/ nkey=[n=mane k=tape] [n.g.i.new (getv a.g.i.new %key)] + |- + ?~ new + !! + ?~ jold + %= ^$ + new t.new + i +(i) + acc %+ snoc acc + ;n(id <i>) + ;+ i.new + == + == + ?~ old + !! + ?: =(%skip n.g.i.jold) + $(jold t.jold, j +(j)) + ?: .=(nkey [n.g.i.jold (getv a.g.i.jold %key)]) + ?. =(0 j) + =/ n=@ud 0 + =/ nnew=marl new + =/ okey=[n=mane k=tape] [n.g.i.old (getv a.g.i.old %key)] + |- + ?~ nnew + ^^$(old (snoc t.old i.old)) + ?: =(%m n.g.i.nnew) + $(nnew t.nnew, n +(n)) + =/ nnky=[n=mane k=tape] [n.g.i.nnew (getv a.g.i.nnew %key)] + ?. .=(okey nnky) + $(nnew t.nnew, n +(n)) + ?: (gte n j) + =/ aupd=mart (upda a.g.i.old a.g.i.nnew) + ?~ aupd + %= ^^$ + old c.i.old + new c.i.nnew + i 0 + acc + %= ^^$ + old t.old + new %^ newm new n + ;m(id <(add n i)>, key k.nnky); + == + == + %= ^^$ + old c.i.old + new c.i.nnew + i 0 + acc + %= ^^$ + old t.old + new %^ newm new n + ;m(id <(add n i)>, key k.nnky); + acc :_ acc + [[%c [[%key k.nnky] aupd]] ~] + == + == + =/ aupd=mart (upda a.g.i.jold a.g.i.new) + ?~ aupd + %= ^^$ + old c.i.jold + new c.i.new + i 0 + acc + %= ^^$ + old (newm old j ;skip;) + new t.new + i +(i) + acc %+ snoc acc + ;m(id <i>, key k.nkey); + == + == + %= ^^$ + old c.i.jold + new c.i.new + i 0 + acc + %= ^^$ + old (newm old j ;skip;) + new t.new + i +(i) + acc :- [[%c [[%key k.nkey] aupd]] ~] + %+ snoc + acc + ;m(id <i>, key k.nkey); + == + == + ?: =("text" (getv a.g.i.new %mast)) + ?: =(+.-.+.-.-.+.-.old +.-.+.-.-.+.-.new) + ^$(old t.old, new t.new, i +(i)) + %= ^$ + old t.old + new t.new + i +(i) + acc [i.new acc] + == + =/ aupd=mart (upda a.g.i.old a.g.i.new) + ?~ aupd + %= ^$ + old c.i.old + new c.i.new + i 0 + acc ^$(old t.old, new t.new, i +(i)) + == + %= ^$ + old c.i.old + new c.i.new + i 0 + acc + %= ^$ + old t.old + new t.new + i +(i) + acc :_ acc + [[%c [[%key k.nkey] aupd]] ~] + == + == + $(jold t.jold, j +(j)) +:: +++ adky + |= root=manx + |^ ^- manx + (tanx root "0" "~") + ++ tanx + |= [m=manx key=tape pkey=tape] + =/ fkey=tape (getv a.g.m %key) + =/ nkey=tape ?~(fkey key fkey) + ?: =(%$ n.g.m) + ;span + =mast "text" + =key nkey + =pkey pkey + ;+ m + == + =: a.g.m %- mart + ?~ fkey + [[%key nkey] [[%pkey pkey] a.g.m]] + [[%pkey pkey] a.g.m] + c.m (tarl c.m nkey) + == + m + ++ tarl + |= [m=marl key=tape] + =/ i=@ud 0 + |- ^- marl + ?~ m + ~ + :- %^ tanx + (manx i.m) + (weld (scow %ud i) (weld "-" key)) + key + $(m t.m, i +(i)) + -- +:: +++ getv + |= [m=mart tag=@tas] + ^- tape + ?~ m + ~ + ?: =(n.i.m tag) + v.i.m + $(m t.m) +:: +++ upda + |= [om=mart nm=mart] + =/ acc=mart ~ + |- ^- mart + ?~ nm + ?~ om + acc + :_ acc + :- %rem + =/ omom=mart om + |- + ?~ omom + ~ + =/ nom=tape +:<n.i.omom> + |- + ?~ nom + [' ' ^$(omom t.omom)] + [i.nom $(nom t.nom)] + =/ i=@ud 0 + =/ com=mart om + |- + ?~ nm + !! + ?~ com + ^$(nm t.nm, acc [i.nm acc]) + ?~ om + !! + ?: =(n.i.com n.i.nm) + ?: =(v.i.com v.i.nm) + ^$(om (oust [i 1] (mart om)), nm t.nm) + %= ^$ + om (oust [i 1] (mart om)) + nm t.nm + acc [i.nm acc] + == + $(com t.com, i +(i)) +:: +++ newm + |= [ml=marl i=@ud mx=manx] + =/ j=@ud 0 + |- ^- marl + ?~ ml + ~ + :- ?: =(i j) + mx + i.ml + $(ml t.ml, j +(j)) +:: +++ paru + |= turl=tape + ^- path + =/ tacc=tape ~ + =/ pacc=path ~ + |- + ?~ turl + ?~ tacc + pacc + (snoc pacc (crip tacc)) + ?: =('/' i.turl) + ?~ tacc + $(turl t.turl) + %= $ + turl t.turl + tacc ~ + pacc (snoc pacc (crip tacc)) + == + $(turl t.turl, tacc (snoc tacc i.turl)) +:: :: :: :: +:: +:: Sail +:: +:: :: :: :: +++ script-node + ^- manx + ;script + ;+ ;/ script + == +++ sail-404 + ^- manx + ;html + ;head + ;meta(charset "utf-8"); + == + ;body + ;span: 404 + == + == +:: :: :: :: +:: +:: Script +:: +:: :: :: :: +++ script + ^~ + %- trip + ''' + let ship; + let app; + let displayUpdatePath; + let channelMessageId = 0; + let eventSource; + const channelId = `${Date.now()}${Math.floor(Math.random() * 100)}`; + const channelPath = `${window.location.origin}/~/channel/${channelId}`; + addEventListener('DOMContentLoaded', async () => { + ship = document.documentElement.getAttribute('ship'); + app = document.documentElement.getAttribute('app'); + displayUpdatePath = document.documentElement.getAttribute('path'); + await connectToShip(); + let eventElements = document.querySelectorAll('[event]'); + eventElements.forEach(el => setEventListeners(el)); + }); + function setEventListeners(el) { + const eventTags = el.getAttribute('event'); + const returnTags = el.getAttribute('return'); + eventTags.split(/\s+/).forEach(eventStr => { + const eventType = eventStr.split('/', 2)[1]; + el[`on${eventType}`] = (e) => pokeShip(e, eventStr, returnTags); + }); + }; + async function connectToShip() { + try { + const storageKey = `${ship}${app}${displayUpdatePath}`; + let storedId = localStorage.getItem(storageKey); + localStorage.setItem(storageKey, channelId); + if (storedId) { + const delPath = `${window.location.origin}/~/channel/${storedId}`; + await fetch(delPath, { + method: 'PUT', + body: JSON.stringify([{ + id: channelMessageId, + action: 'delete' + }]) + }); + }; + const body = JSON.stringify(makeSubscribeBody()); + await fetch(channelPath, { + method: 'PUT', + body + }); + eventSource = new EventSource(channelPath); + eventSource.addEventListener('message', handleChannelStream); + } catch (error) { + console.error(error); + }; + }; + function pokeShip(event, tagString, dataString) { + try { + let data = {}; + if (dataString) { + const dataToReturn = dataString.split(/\s+/); + dataToReturn.forEach(dataTag => { + let splitDataTag = dataTag.split('/'); + if (splitDataTag[0] === '') splitDataTag.shift(); + const kind = splitDataTag[0]; + const key = splitDataTag.pop(); + if (kind === 'event') { + if (!(key in event)) { + console.error(`Property: ${key} does not exist on the event object`); + return; + }; + data[dataTag] = String(event[key]); + } else if (kind === 'target') { + if (!(key in event.currentTarget)) { + console.error(`Property: ${key} does not exist on the target object`); + return; + }; + data[dataTag] = String(event.currentTarget[key]); + } else { + const elementId = splitDataTag.join('/'); + const linkedEl = document.getElementById(elementId); + if (!linkedEl) { + console.error(`No element found for id: ${kind}`); + return; + }; + if (!(key in linkedEl)) { + console.error(`Property: ${key} does not exist on the object with id: ${elementId}`); + return; + }; + data[dataTag] = String(linkedEl[key]); + }; + }); + }; + fetch(channelPath, { + method: 'PUT', + body: JSON.stringify(makePokeBody({ + tags: tagString, + data + })) + }); + } catch (error) { + console.error(error); + }; + }; + function handleChannelStream(event) { + try { + const streamResponse = JSON.parse(event.data); + if (streamResponse.response !== 'diff') return; + fetch(channelPath, { + method: 'PUT', + body: JSON.stringify(makeAck(streamResponse.id)) + }); + const htmlData = streamResponse.json; + if (!htmlData) return; + let container = document.createElement('template'); + container.innerHTML = htmlData; + if (container.content.firstElementChild.childNodes.length === 0) return; + const navUrl = container.content.firstElementChild.getAttribute('url'); + if (navUrl && (navUrl !== window.location.pathname)) { + history.pushState({}, '', navUrl); + }; + while (container.content.firstElementChild.children.length > 0) { + let gustChild = container.content.firstElementChild.firstElementChild; + if (gustChild.tagName === 'D') { + for (const att of gustChild.attributes) { + const dkey = att.value; + document.querySelector(`[key="${dkey}"]`).remove(); + }; + gustChild.remove(); + } else if (gustChild.tagName === 'N') { + const nodeKey = gustChild.firstElementChild.getAttribute('key'); + const parentKey = gustChild.firstElementChild.getAttribute('pkey'); + const appendIndex = gustChild.id; + let domParent = document.querySelector(`[key="${parentKey}"]`); + domParent.insertBefore(gustChild.firstElementChild, domParent.children[appendIndex]); + let appendedChild = domParent.querySelector(`[key="${nodeKey}"]`); + if (appendedChild.getAttribute('event')) { + setEventListeners(appendedChild); + }; + if (appendedChild.childElementCount > 0) { + let needingListeners = appendedChild.querySelectorAll('[event]'); + needingListeners.forEach(child => setEventListeners(child)); + }; + appendedChild = appendedChild.nextElementSibling; + gustChild.remove(); + } else if (gustChild.tagName === 'M') { + const nodeKey = gustChild.getAttribute('key'); + const nodeIndex = gustChild.id; + let existentNode = document.querySelector(`[key="${nodeKey}"]`); + let childAtIndex = existentNode.parentElement.children[nodeIndex]; + if (existentNode.nextElementSibling + && (existentNode.nextElementSibling.getAttribute('key') + === childAtIndex.getAttribute('key'))) { + existentNode.parentElement.insertBefore(existentNode, childAtIndex.nextElementSibling); + } else { + existentNode.parentElement.insertBefore(existentNode, childAtIndex); + }; + gustChild.remove(); + } else if (gustChild.tagName === 'C') { + const nodeKey = gustChild.getAttribute('key'); + const attToRem = gustChild.getAttribute('rem')?.slice(0, -1).split(' ') ?? []; + let existentNode = document.querySelector(`[key="${nodeKey}"]`); + attToRem.forEach(att => { + if (att === 'event') { + const eventType = existentNode.getAttribute('event').split('/', 2)[1]; + existentNode[`on${eventType}`] = null; + }; + existentNode.removeAttribute(att); + }); + gustChild.removeAttribute('key'); + gustChild.removeAttribute('rem'); + for (const att of gustChild.attributes) { + existentNode.setAttribute(att.name, att.value); + if (att.name === 'event') { + const eventType = existentNode.getAttribute('event').split('/', 2)[1]; + existentNode[`on${eventType}`] = null; + setEventListeners(existentNode); + }; + }; + gustChild.remove(); + } else { + const nodeKey = gustChild.getAttribute('key'); + let existentNode = document.querySelector(`[key="${nodeKey}"]`); + existentNode.replaceWith(gustChild); + let replacedNode = document.querySelector(`[key="${nodeKey}"]`); + if (replacedNode.getAttribute('event')) { + setEventListeners(replacedNode); + }; + if (replacedNode.childElementCount > 0) { + let needingListeners = replacedNode.querySelectorAll('[event]'); + needingListeners.forEach(child => setEventListeners(child)); + }; + }; + }; + } catch (error) { + console.error(error); + }; + }; + function makeSubscribeBody() { + channelMessageId++; + return [{ + id: channelMessageId, + action: 'subscribe', + ship: ship, + app: app, + path: displayUpdatePath + }]; + }; + function makePokeBody(jsonData) { + channelMessageId++; + return [{ + id: channelMessageId, + action: 'poke', + ship: ship, + app: app, + mark: 'json', + json: jsonData + }]; + }; + function makeAck(eventId) { + channelMessageId++; + return [{ + id: channelMessageId, + action: 'ack', + "event-id": eventId + }]; + }; + ''' +--
\ No newline at end of file diff --git a/desk/lib/mop-extensions.hoon b/desk/lib/mop-extensions.hoon new file mode 100644 index 0000000..e82e286 --- /dev/null +++ b/desk/lib/mop-extensions.hoon @@ -0,0 +1,158 @@ +|* [key=mold val=mold] +=> |% + +$ item [key=key val=val] + -- +~% %mope-comp ..zuse ~ +|= compare=$-([key key] ?) +~% %mope-core ..zuse ~ +|% +:: +uno: merge with conflict resolution function +:: +++ uno + ~/ %uno + |= [a=(tree item) b=(tree item)] + |= [meg=$-([key val val] val)] + ^- (tree item) + ?~ b a + ?~ a b + ?: =(key.n.a key.n.b) + :- n=[key.n.a (meg key.n.a val.n.a val.n.b)] + [l=$(a l.a, b l.b) r=$(a r.a, b r.b)] + ?: (mor key.n.a key.n.b) + ?: (compare key.n.b key.n.a) + $(l.a $(a l.a, r.b ~), b r.b) + $(r.a $(a r.a, l.b ~), b l.b) + ?: (compare key.n.a key.n.b) + $(l.b $(b l.b, r.a ~), a r.a) + $(r.b $(b r.b, l.a ~), a l.a) +:: +bat: tabulate a subset excluding start element with a max count (backwards) +:: +++ bat + |= [a=(tree item) b=(unit key) c=@] + ^- (list item) + |^ + e:(tabulate (del-span a b) b c) + :: + ++ tabulate + |= [a=(tree item) b=(unit key) c=@] + ^- [d=@ e=(list item)] + ?: ?&(?=(~ b) =(c 0)) + [0 ~] + =| f=[d=@ e=(list item)] + |- ^+ f + ?: ?|(?=(~ a) =(d.f c)) f + =. f $(a r.a) + ?: =(d.f c) f + =. f [+(d.f) [n.a e.f]] + ?:(=(d.f c) f $(a l.a)) + :: + ++ del-span + |= [a=(tree item) b=(unit key)] + ^- (tree item) + ?~ a a + ?~ b a + ?: =(key.n.a u.b) + l.a + ?. (compare key.n.a u.b) + $(a l.a) + a(r $(a r.a)) + -- +:: +dop: dip:on but in reverse order (right to left) +:: +++ dop + |* state=mold + |= $: a=(tree item) + =state + f=$-([state item] [(unit val) ? state]) + == + ^+ [state a] + :: acc: accumulator + :: + :: .stop: set to %.y by .f when done traversing + :: .state: threaded through each run of .f and produced by +abet + :: + =/ acc [stop=`?`%.n state=state] + =< abet =< main + |% + ++ this . + ++ abet [state.acc a] + :: +main: main recursive loop; performs a partial inorder traversal + :: + ++ main + ^+ this + :: stop if empty or we've been told to stop + :: + ?: =(~ a) this + ?: stop.acc this + :: reverse in-order traversal: right -> node -> left, until .f sets .stop + :: + =. this right + ?: stop.acc this + =^ del this node + =? this !stop.acc left + :: XX: remove for now; bring back when upstreaming + :: =? a del (nip a) + this + :: +node: run .f on .n.a, updating .a, .state, and .stop + :: + ++ node + ^+ [del=*? this] + :: run .f on node, updating .stop.acc and .state.acc + :: + ?> ?=(^ a) + =^ res acc (f state.acc n.a) + ?~ res + [del=& this] + [del=| this(val.n.a u.res)] + :: +left: recurse on left subtree, copying mutant back into .l.a + :: + ++ left + ^+ this + ?~ a this + =/ lef main(a l.a) + lef(a a(l a.lef)) + :: +right: recurse on right subtree, copying mutant back into .r.a + :: + ++ right + ^+ this + ?~ a this + =/ rig main(a r.a) + rig(a a(r a.rig)) + -- +:: +bot: produce the N leftmost elements +:: +++ bot + |= [a=(tree item) b=@] + ^- (list item) + |^ p:(items-with-remainder a b) + ++ items-with-remainder + |= [a=(tree item) b=@] + ^- (pair (list item) @) + ?~ a [~ b] + ?: =(b 0) [~ 0] + =/ left-result (items-with-remainder l.a b) + ?: =(q.left-result 0) left-result + ?: =(q.left-result 1) [(zing ~[p.left-result ~[n.a]]) (dec q.left-result)] + =/ right-result + (items-with-remainder r.a (dec q.left-result)) + [(zing ~[p.left-result ~[n.a] p.right-result]) q.right-result] + -- +:: +top: produce the N rightmost elements +:: +++ top + |= [a=(tree item) b=@] + ^- (list item) + |^ p:(items-with-remainder a b) + ++ items-with-remainder + |= [a=(tree item) b=@] + ^- (pair (list item) @) + ?~ a [~ b] + ?: =(b 0) [~ 0] + =/ right-result (items-with-remainder r.a b) + ?: =(q.right-result 0) right-result + ?: =(q.right-result 1) [[n.a p.right-result] (dec q.right-result)] + =/ left-result + (items-with-remainder l.a (dec q.right-result)) + [(zing ~[p.left-result ~[n.a] p.right-result]) q.left-result] + -- +-- diff --git a/desk/lib/new-sigil/core.hoon b/desk/lib/new-sigil/core.hoon new file mode 100644 index 0000000..342689b --- /dev/null +++ b/desk/lib/new-sigil/core.hoon @@ -0,0 +1,9 @@ +/+ symbols=sigil-symbols +|% +=| p=@p +++ $ +=/ background "#000" +=/ foreground "#FFF" +=/ size 128 +=/ phonemes (chunk p) +--
\ No newline at end of file diff --git a/desk/lib/new-sigil/symbols.hoon b/desk/lib/new-sigil/symbols.hoon new file mode 100644 index 0000000..4069f1d --- /dev/null +++ b/desk/lib/new-sigil/symbols.hoon @@ -0,0 +1,1026 @@ +|% + ++ bac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ bal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='128' y1='32.0072' x2='32.7071' y2='127.3' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='128' y1='64.0072' x2='64.7071' y2='127.3' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='128' y1='96.0072' x2='96.7071' y2='127.3' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ ban +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0C128 70.6924 70.6924 128 -1.52588e-05 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0C128 35.3462 99.3462 64 64 64C28.6538 64 0 35.3462 0 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ bel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ben +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='8' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ber +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bes +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 128C64 92.6538 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ bet +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0036' y1='15.9965' x2='48.0036' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0036' y1='15.9965' x2='48.0036' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ bic +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96C74.9807 96 32 53.0193 32 -4.19629e-06' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0C32 70.6925 74.9807 128 128 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.004' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ bin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bis +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='96' x2='-8.87604e-09' y2='96' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='32' x2='-8.87604e-09' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bon +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ bos +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bot +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bud +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M16 64C16 90.5097 37.4903 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ bur +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ bus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 128C32 110.327 17.6731 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ byl +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ byn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0C128 35.3511 113.669 67.3551 90.5 90.5193' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ byr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='48' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ byt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dab +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ dac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L-5.96046e-08 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='63.29' y2='63.2929' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='128' y1='32.0072' x2='32.7071' y2='127.3' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='128' y1='64.0072' x2='64.7071' y2='127.3' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='128' y1='96.0072' x2='96.7071' y2='127.3' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ dan +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='96' y1='2.18557e-08' x2='96' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dap +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.004' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><path d='M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ das +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ dat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 -1.54503e-06 128 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dav +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ deb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 -6.35781e-07C64 35.3462 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='112' cy='16' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='112' cy='16' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ def +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 128L128 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 94L94 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 64L64 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 32L32 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ deg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 128C64 92.6538 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ del +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dem +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 -6.35781e-07C64 35.3462 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ den +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ dep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ der +"<g transform='@TR'><path d='M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 128L96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ des +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ det +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9964' y1='111.996' x2='47.9964' y2='79.9964' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='96.5' y1='3.07317e-08' x2='96.5' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32.5' y1='3.07317e-08' x2='32.5' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ dib +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='8.74228e-08' y1='64' x2='128' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='5.25874e-08' y1='32' x2='128' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dif +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='16' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='16' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ dig +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64.5' y1='-0.5' x2='64.5' y2='127.5' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='16.0035' y1='15.9965' x2='48.0035' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0036' y1='79.9964' x2='112.004' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ din +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='96' y1='2.18557e-08' x2='96' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dir +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 64C96 81.6731 81.6731 96 64 96' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='16.0035' y1='15.9965' x2='48.0035' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dis +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.0029152 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ div +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-4.19629e-06 96C70.6924 96 128 53.0193 128 5.59506e-06' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-2.79753e-06 64C70.6924 64 128 35.3462 128 5.59506e-06' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ doc +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M127.997 0L-0.00291443 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726C28.8758 53.8694 28.8758 74.1306 41.3726 86.6274' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-4.19629e-06 16C26.5097 16 48 37.4903 48 64C48 90.5097 26.5097 112 0 112' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ don +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-3.8147e-06 128C-7.24632e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='63.5' x2='128' y2='63.5' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dos +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M86.6274 86.6274C99.1242 74.1306 99.1242 53.8693 86.6274 41.3725C74.1306 28.8758 53.8694 28.8758 41.3726 41.3725' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dot +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dov +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ doz +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128L0 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M30.0589 30.0589C48.804 11.3137 79.196 11.3137 97.9411 30.0589C116.686 48.804 116.686 79.196 97.9411 97.9411' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M52.6863 52.6863C58.9347 46.4379 69.0653 46.4379 75.3137 52.6863C81.5621 58.9347 81.5621 69.0653 75.3137 75.3137' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M41.3726 41.3726C53.8694 28.8758 74.1306 28.8758 86.6274 41.3726C99.1242 53.8694 99.1242 74.1306 86.6274 86.6274' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ duc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 16C90.5097 16 112 37.4903 112 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 64L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dun +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dur +"<g transform='@TR'><path d='M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 -3.05151e-06C32 53.0193 74.9807 96 128 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ dut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dux +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dyl +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M2.03434e-06 128C70.6924 128 128 70.6925 128 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dyn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dyr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ dys +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-3.8147e-06 1.11901e-05C-7.24633e-07 35.3462 28.6538 64 64 64C99.3462 64 128 35.3462 128 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ dyt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fab +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ fad +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fal +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 128L128 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fam +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fan +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fas +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ feb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fed +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fen +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fep +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fer +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fes +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fet +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ fid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00291443 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fig +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='98' y1='2.18557e-08' x2='98' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fip +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fir +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='80.0036' y1='79.9965' x2='112.004' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='16.0035' y1='15.9965' x2='48.0035' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ fog +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M86.6274 86.6274C99.1242 74.1306 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fon +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M16 64C16 90.5097 37.4903 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ for +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='96' y1='2.18557e-08' x2='96' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fos +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 0C96 53.0193 53.0193 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0C64 35.3462 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0C32 17.6731 17.6731 32 0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fot +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9964' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ful +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fun +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9964' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ fur +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M86.8823 41.6275C74.3855 29.1307 54.1242 29.1307 41.6274 41.6275C29.1307 54.1243 29.1307 74.3855 41.6274 86.8823' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M32 128C32 110.327 17.6731 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ fyl +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fyn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ fyr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00268555 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hab +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ hac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ had +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hal +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64.5' y1='-0.5' x2='64.5' y2='127.5' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M16 64C16 90.5097 37.4903 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ han +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hap +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ har +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ has +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='16' r='8' fill='@FG' stroke='@FG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M48 32C48 40.8366 40.8366 48 32 48C23.1634 48 16 40.8366 16 32C16 23.1634 23.1634 16 32 16C40.8366 16 48 23.1634 48 32ZM32 40C36.4183 40 40 36.4183 40 32C40 27.5817 36.4183 24 32 24C27.5817 24 24 27.5817 24 32C24 36.4183 27.5817 40 32 40Z' fill='@BG'/></g>", + ++ hav +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='96' y1='2.18557e-08' x2='96' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ heb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M2.03434e-06 128C70.6924 128 128 70.6925 128 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hep +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.00285417' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ hes +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M48 96C48 104.837 40.8366 112 32 112C23.1634 112 16 104.837 16 96C16 87.1634 23.1634 80 32 80C40.8366 80 48 87.1634 48 96ZM32 104C36.4183 104 40 100.418 40 96C40 91.5817 36.4183 88 32 88C27.5817 88 24 91.5817 24 96C24 100.418 27.5817 104 32 104Z' fill='@BG'/></g>", + ++ het +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 128L96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ hid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M2.03434e-06 128C70.6924 128 128 70.6925 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M5.08584e-07 32C17.6731 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='8.74228e-08' y1='64' x2='128' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M48 64C48 72.8366 40.8366 80 32 80C23.1634 80 16 72.8366 16 64C16 55.1634 23.1634 48 32 48C40.8366 48 48 55.1634 48 64ZM32 72C36.4183 72 40 68.4183 40 64C40 59.5817 36.4183 56 32 56C27.5817 56 24 59.5817 24 64C24 68.4183 27.5817 72 32 72Z' fill='@BG'/></g>", + ++ hob +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hoc +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ hol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hos +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0036' y1='79.9965' x2='112.004' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='16.0036' y1='15.9965' x2='48.0036' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='48' cy='48' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='48' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='80' cy='47' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='47' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='80' cy='81' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='81' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='48' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='48' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 96C46.3269 96 32 81.6731 32 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ hut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lab +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='15.9964' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 -9.40976e-06C64 70.6924 92.6538 128 128 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 -7.63193e-07C32 70.6924 74.9807 128 128 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lad +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='95.35' y1='32.7071' x2='32.0571' y2='96' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lag +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 112C90.5097 112 112 90.5097 112 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lan +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lap +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='112' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='112' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='2.78181e-08' y1='64' x2='128' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ las +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M2.03434e-06 128C70.6924 128 128 70.6925 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M5.08584e-07 32C17.6731 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lav +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C92.6489 128 60.6449 113.669 37.4807 90.5' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ leb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-1.64036e-05 32C53.0193 32 96 74.9807 96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ led +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ leg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M7.63192e-07 32C17.6731 32 32 46.3269 32 64C32 81.6731 17.6731 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ len +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96C110.327 96 96 110.327 96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ler +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ let +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='15.9965' y1='111.997' x2='47.9965' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ lib +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0036' y1='15.9965' x2='48.0036' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ lig +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='128' x2='64' y2='-6.55671e-08' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='80' cy='64' r='8' fill='@BG'/></g>", + ++ lis +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-4.70488e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00286865 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 0C128 35.3511 113.669 67.3551 90.5 90.5193' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ liv +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-5.21346e-06 32C70.6924 32 128 17.6731 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M3.4331e-06 96C70.6924 96 128 53.0193 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ loc +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96C74.9807 96 32 53.0193 32 -4.19629e-06' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M16 64C16 90.5097 37.4903 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lom +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lon +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M2.03434e-06 128C70.6924 128 128 70.6925 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M5.08584e-07 32C17.6731 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='32' x2='-8.87604e-09' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ los +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ luc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lud +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lug +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lun +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lup +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lur +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lux +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ lyd +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lyn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lyr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00268555 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='80' cy='48' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='48' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lys +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ lyt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.003' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ lyx +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ mag +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.004' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ map +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0036' y1='79.9965' x2='112.004' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.0029152 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 64L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mas +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ mat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32C110.327 32 96 17.6731 96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ meb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 -3.05151e-06C32 53.0193 74.9807 96 128 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.003' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ med +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ meg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9964' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mer +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mes +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='15.9964' y1='111.996' x2='47.9964' y2='79.9964' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ met +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 128L32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ mic +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-2.09815e-06 80C26.5097 80 48 101.49 48 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mig +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='80.0036' y1='79.9965' x2='112.004' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='32' x2='-4.37114e-08' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='96' x2='-4.37114e-08' y2='96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ min +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ mip +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mir +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0036' y1='15.9964' x2='48.0036' y2='47.9964' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mis +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00286865 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ mit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ moc +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 96L128 96' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='16.0035' y1='15.9965' x2='48.0035' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mog +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M112 64C112 90.5097 90.5097 112 64 112C37.4903 112 16 90.5097 16 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M112 0C112 26.5097 90.5097 48 64 48C37.4903 48 16 26.5097 16 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mon +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ mop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0035' y1='15.9964' x2='48.0035' y2='47.9964' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='15.9964' y1='111.996' x2='47.9964' y2='79.9964' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mos +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mot +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mud +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='80' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mug +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.003' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mun +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mur +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ mus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 128C96 74.9807 53.0193 32 0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ mut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ myl +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0035' y1='15.9965' x2='48.0035' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='16' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='16' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ myn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 1.52638e-06C57.3076 -7.74381e-06 9.2702e-06 57.3075 0 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32C74.9807 32 32 74.9807 32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C110.327 96 96 110.327 96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ myr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ nal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M2.82114e-06 110C60.7513 110 110 60.7513 110 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-5.09828e-06 73C40.3168 73 73 40.3168 73 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-6.63647e-07 37C20.4345 37 37 20.4345 37 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nam +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='8.74228e-08' y1='64' x2='128' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='112' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='112' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nap +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='8' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-1.52588e-05 128C-9.07866e-06 57.3075 57.3076 1.44926e-06 128 7.62939e-06' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nav +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ neb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32C74.9807 32 32 74.9807 32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ned +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00268555 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 1.90735e-06C96 53.0193 53.0193 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nem +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nep +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C57.3076 128 3.09007e-06 70.6925 0 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C74.9807 96 32 53.0193 32 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32C110.327 32 96 17.6731 96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ner +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='15.9965' y1='111.997' x2='47.9965' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nes +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ net +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 64L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.003' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ nib +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 128C92.6538 128 64 70.6925 64 7.63192e-07' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='32' x2='-8.87604e-09' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nim +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nis +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32C74.9807 32 32 74.9807 32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00285435 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ noc +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='1.51277e-05' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nom +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 96C46.3269 96 32 81.6731 32 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nos +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nov +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M2.03434e-06 128C70.6924 128 128 70.6925 128 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M5.08584e-07 32C17.6731 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nub +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ num +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nup +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='31' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='31' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.003' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nux +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nyd +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nyl +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nym +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nyr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00268555 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M95.9984 0C95.9984 26.3298 85.3985 50.1839 68.2332 67.5278M63.9983 0C63.9983 17.4933 56.9799 33.3473 45.6054 44.8999M31.9983 0C31.9983 8.65672 28.5609 16.5106 22.9766 22.2711' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nys +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ nyt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 32C81.6731 32 96 46.3269 96 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 16C90.5097 16 112 37.4903 112 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ nyx +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ pac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pad +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pag +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9964' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pan +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M41.3726 86.6274C28.8758 74.1306 28.8758 53.8693 41.3726 41.3725C53.8694 28.8758 74.1306 28.8758 86.6274 41.3725' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ par +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pas +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 -2.67054e-06C32 53.0193 74.9807 96 128 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 -1.78036e-06C64 35.3462 92.6538 64 128 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 -8.9018e-07C96 17.6731 110.327 32 128 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ped +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ peg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pem +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 128C64 92.6538 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pen +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ per +"<g transform='@TR'><path d='M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pes +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 112C90.5097 112 112 90.5097 112 64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='-0.00285417' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ pet +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.003' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ pic +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 128C96 74.9807 53.0193 32 0 32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 92.6538 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128C32 110.327 17.6731 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ pil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ poc +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64.5' y1='-0.5' x2='64.5' y2='127.5' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='96.5' y1='-0.5' x2='96.5' y2='127.5' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32.5' y1='-0.5' x2='32.5' y2='127.5' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='96' x2='-8.87604e-09' y2='96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='32' x2='-8.87604e-09' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pon +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pos +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pub +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pun +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M80 64C80 55.1634 72.8366 48 64 48' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pur +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M3.73284e-05 64C17.6633 64 33.6554 56.8445 45.2356 45.2741' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ put +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ pyl +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-5.59506e-06 128C35.3462 128 64 99.3462 64 64C64 28.6538 35.3462 1.54503e-06 0 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ pyx +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ rab +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line x1='15.9965' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rac +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ rad +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ rag +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0036' y1='15.9965' x2='48.0036' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ral +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ram +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ ran +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00291443 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rap +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='-1.29797e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ rav +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ reb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 -9.40976e-06C57.3075 -6.31969e-06 -3.09007e-06 57.3075 0 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ red +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ref +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ reg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rem +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ren +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.003' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 128C32 74.9807 74.9807 32 128 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ res +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.003' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ret +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9965' y1='111.997' x2='53.9965' y2='73.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ rex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ rib +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='8.74228e-08' y1='64' x2='128' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ric +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 128C96 74.9807 53.0193 32 0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rig +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ril +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ rin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rip +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ris +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 0C128 35.3511 113.669 67.3551 90.5 90.5193' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ riv +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ roc +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='112' cy='16' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='112' cy='16' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ rol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ron +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0C128 70.6924 70.6925 128 0 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ros +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ rov +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 0C128 35.3511 113.669 67.3551 90.5 90.5193' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ruc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rud +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9964' x2='112.003' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ rum +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M5.08584e-07 32C17.6731 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ run +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0L96 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rup +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 128C64 92.6538 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ rux +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 64C32 81.6731 46.3269 96 64 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ryc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ryd +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 64C96 81.6731 81.6731 96 64 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ryg +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='16.0035' y1='15.9965' x2='48.0035' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ryl +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 128C92.6489 128 60.6449 113.669 37.4807 90.5' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ rym +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ryn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C57.3075 128 -3.09007e-06 70.6925 0 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ryp +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ rys +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ryt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ ryx +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sab +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ sal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 128L128 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sam +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ san +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ sap +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='64' r='8' fill='@BG'/></g>", + ++ sar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C128 57.3076 70.6925 0 0 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sav +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ seb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sed +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sef +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ seg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 128C32 110.327 46.3269 96 64 96C81.6731 96 96 110.327 96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='8' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sem +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ sen +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 128C96 110.327 81.6731 96 64 96C46.3269 96 32 110.327 32 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 128L64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128L32 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 128L96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ser +"<g transform='@TR'><path d='M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ set +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 64L128 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sib +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 9.40976e-06C64 35.3462 92.6538 64 128 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sic +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ sid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 128C110.327 128 96 113.673 96 96C96 78.3269 110.327 64 128 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sig +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sil +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='16.0036' y1='15.9965' x2='48.0036' y2='47.9965' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ sim +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sip +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M16 64C16 37.4903 37.4903 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sit +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ siv +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ soc +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='16' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='16' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ sog +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L-5.96046e-08 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ som +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ son +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='127.553' y1='128.224' x2='63.5528' y2='0.223598' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sop +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 0C128 35.3511 113.669 67.3551 90.5 90.5193' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sov +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 128L128 0' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 128C92.6489 128 60.6449 113.669 37.4807 90.5' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sub +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sud +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ sug +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='80' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 96C46.3269 96 32 81.6731 32 64C32 46.3269 46.3269 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sum +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sun +"<g transform='@TR'><circle cx='64' cy='64' r='64' stroke='@BG' stroke-width='@SW' fill='@FG'/><circle cx='80' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='80' cy='48' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='48' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='48' cy='48' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='48' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='48' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sup +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sur +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M3.73284e-05 64.0001C17.6633 64.0001 33.6554 56.8446 45.2356 45.2742' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ sut +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ syd +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 16C37.4903 16 16 37.4903 16 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ syl +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ sym +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='96.5' y1='3.07317e-08' x2='96.5' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ syn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ syp +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ syr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ syt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ syx +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 128C4.63574e-06 92.6488 14.3309 60.6449 37.5 37.4807' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ tab +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='8' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ tac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tad +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tag +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0036' y1='79.9964' x2='112.004' y2='111.996' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tal +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='0.5' y1='-0.5' x2='181.5' y2='-0.5' transform='matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 128C96 74.9807 53.0193 32 0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tam +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='96' x2='-8.87604e-09' y2='96' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='32' x2='-8.87604e-09' y2='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tan +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M96 128C96 74.9807 53.0193 32 0 32' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 128C64 92.6538 35.3462 64 0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M48 128C48 101.49 26.5097 80 0 80' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M32 128C32 110.327 17.6731 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M16 128C16 119.163 8.83656 112 0 112' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 128C128 57.3075 70.6925 0 0 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tap +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='128' y1='64' x2='-8.87604e-09' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tar +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tas +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ teb +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tec +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.003' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ ted +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ teg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 80C119.163 80 112 72.8366 112 64C112 55.1634 119.163 48 128 48' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='15' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='15' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><path d='M0 0L127.986 127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M32 0L128 96' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 0L128 64' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 0L128 32' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ tem +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='-0.00285417' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ ten +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='48' cy='48' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='48' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='80' cy='48' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='48' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='80' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='80' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='48' cy='80' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='48' cy='80' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.14479e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ ter +"<g transform='@TR'><path d='M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='96.5' y1='3.07317e-08' x2='96.5' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tes +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tev +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='15.9965' y1='111.997' x2='47.9965' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ tic +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32C110.327 32 96 17.6731 96 -1.39876e-06' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='96' y1='2.18557e-08' x2='96' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M112 32C112 40.8366 104.837 48 96 48C87.1634 48 80 40.8366 80 32C80 23.1634 87.1634 16 96 16C104.837 16 112 23.1634 112 32ZM96 40C100.418 40 104 36.4183 104 32C104 27.5817 100.418 24 96 24C91.5817 24 88 27.5817 88 32C88 36.4183 91.5817 40 96 40Z' fill='@BG'/></g>", + ++ til +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0036' y1='79.9965' x2='112.004' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tim +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00291443 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ tin +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tip +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 0L64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ tir +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tob +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ toc +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='96' x2='-8.87604e-09' y2='96' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tod +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tog +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 96C46.3269 96 32 81.6731 32 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ tol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='128' y1='64' x2='-4.37114e-08' y2='64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M16 128C16 101.49 37.4903 80 64 80C90.5097 80 112 101.49 112 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tom +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ ton +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32C74.9807 32 32 74.9807 32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C110.327 96 96 110.327 96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ top +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='16' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tuc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96L0 96' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tud +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tug +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tul +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ tun +"<g transform='@TR'><path d='M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tus +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tux +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tyc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ tyd +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00280762 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='15.9964' y1='111.997' x2='47.9964' y2='79.9965' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ tyl +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tyn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 -2.28831e-06C57.3076 -3.13131e-06 8.42999e-07 57.3075 0 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ typ +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M96 1.90735e-06C96 53.0193 53.0193 96 0 96' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tyr +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 0L128 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M0 64C35.3462 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ tyv +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M256 0L128 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wac +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='11.5' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='16' cy='112' r='9' fill='@FG' stroke='@FG' stroke-width='@SW'/></g>", + ++ wal +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64.5' y1='-0.5' x2='64.5' y2='127.5' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wan +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wat +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ web +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 128C128 57.3075 70.6925 0 0 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wed +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ weg +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M79.5254 0C79.5254 8.83656 72.3619 16 63.5254 16C54.6888 16 47.5254 8.83656 47.5254 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wel +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 32C74.9807 32 32 74.9807 32 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 64C92.6538 64 64 92.6538 64 128' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C110.327 96 96 110.327 96 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wen +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/></g>", + ++ wep +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wer +"<g transform='@TR'><path d='M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M32 0L32 128' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wes +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='80.0035' y1='79.9965' x2='112.003' y2='111.997' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='112' cy='112' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='112' cy='112' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wet +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M64 64H0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wex +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ wic +"<g transform='@TR'><path d='M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wid +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='48.0035' y1='80.0036' x2='16.0035' y2='112.004' stroke='@BG' fill='none' stroke-width='@SW'/><path fill-rule='evenodd' clip-rule='evenodd' d='M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z' fill='@BG'/></g>", + ++ win +"<g transform='@TR'><rect width='128' height='128' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wis +"<g transform='@TR'><path d='M0 0C0 70.6925 57.3075 128 128 128V0H0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 64L0 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 32L0 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wit +"<g transform='@TR'><path d='M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line x1='64' y1='2.18557e-08' x2='64' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='32' y1='2.18557e-08' x2='32' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='96' y1='2.18557e-08' x2='96' y2='128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wol +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M0 64L128 64' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wor +"<g transform='@TR'><path d='M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><line y1='-0.5' x2='45.2548' y2='-0.5' transform='matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)' stroke='@BG' fill='none' stroke-width='@SW'/><line x1='-0.0029152' x2='127.983' y2='127.986' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M64 96C46.3269 96 32 81.6731 32 64' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='64' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wyc +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wyd +"<g transform='@TR'><path d='M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><path d='M32 64C32 46.3269 46.3269 32 64 32' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='32' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wyl +"<g transform='@TR'><path d='M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-3.8147e-06 128C-7.24633e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wyn +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M1.52575e-06 96C53.0193 96 96 53.0193 96 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M1.01717e-06 64C35.3462 64 64 35.3462 64 0' stroke='@BG' fill='none' stroke-width='@SW'/><path d='M5.08584e-07 32C17.6731 32 32 17.6731 32 0' stroke='@BG' fill='none' stroke-width='@SW'/></g>", + ++ wyt +"<g transform='@TR'><path d='M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M128 0L0 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='64' cy='64' r='48' stroke='@BG' fill='none' stroke-width='@SW'/><circle cx='16' cy='64' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='16' cy='64' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ wyx +"<g transform='@TR'><path d='M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z' fill='@FG' stroke='@BG' stroke-width='@SW'/><path d='M-0.00292969 0L127.997 128' stroke='@BG' stroke-linecap='square' fill='none' stroke-width='@SW'/><circle cx='32' cy='96' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='96' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='32' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='32' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/><circle cx='96' cy='32' r='11.5' fill='@FG' stroke='@FG' stroke-width='@SW'/><circle cx='96' cy='32' r='9' fill='@BG' stroke='@BG' stroke-width='@SW'/></g>", + ++ zod +"<g transform='@TR'><circle cx='64' cy='64' r='64' fill='@FG' stroke='@BG' stroke-width='@SW'/></g>", +-- diff --git a/desk/lib/openai.hoon b/desk/lib/openai.hoon new file mode 100644 index 0000000..4d42bd8 --- /dev/null +++ b/desk/lib/openai.hoon @@ -0,0 +1,763 @@ +/- cookies +/+ server, sr=sortug +:: |_ key=@t +|% +++ key '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' +.^(scry:cookies ()) +:: follows open AI reference docs as of 07-OCT-2023 +++ api-key (crip "Bearer {(trip key)}") +++ base-url "https://api.openai.com/v1" +:: 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 ++$ ljson $%([%s @t] [%n @t]) +:: Passes each member of list a to gate b, which must produce a unit. Produces a new list with all the results that do not produce ~. +++ clean +|* [key=@tas j=?(%s %n) d=(unit)] +?~ d ~ +`[key j u.d] + +:: ++ audio +:: |% +:: ++ endpoint "/audio" +:: +$ response-format $?(%json %text %srt %verbose-json %vtt) +:: ++ transcription +:: |% +:: ++ endpoint "/transcriptions" +:: +$ req +:: $: file=file +:: model=@t :: 'whisper-1' +:: language=(unit @t) +:: prompt=(unit @t) +:: response-format=(unit response-format) +:: temperature=(unit @rd) :: 0-1 + +:: == +:: ++ ret %todo +:: -- +:: ++ translation +:: |% +:: ++ endpoint "/audio/translation" +:: +$ req +:: $: file=file +:: model=@t :: 'whisper-1' +:: prompt=(unit @t) +:: response-format=(unit response-format) +:: temperature=(unit @rd) :: 0-1 +:: == +:: -- +:: -- +++ test +|= text=@t +(chat [~[[%system text 'Pepe']] 'gpt-3.5-turbo']) +++ chat +|^ request:completions + ++ endpoint "/chat" + ++ completions + |% + ++ t + |% + +$ role $?(%system %user %assistant %function) + +$ function-call + $: name=@t + arguments=@t + == + +$ function + $: description=(unit @t) + name=@t + parameters=object:json-schema:sortug + == + +$ logit-bias (map @t @ud) + +$ stop $@(@t (list @t)) :: up to 4 sequences + +$ message + $: =role + content=$?(@t ~) :: not optional, but can be null + name=@t + == + +$ request + $: messages=(list message) + model=@tas + :: frequency-penalty=(unit @ud) :: -2.0 to 2.0 + :: function-call=(unit function-call) + :: functions=(list function) + :: logit-bias=(unit logit-bias) + :: max-tokens=(unit @ud) + :: n=(unit @ud) + :: presence-penalty=(unit @ud) + :: stop=(unit stop) + :: stream=(unit ?) :: SSE, nice + :: temperature=(unit @ud) + :: top-p=(unit @ud) + :: user=(unit @t) + == + +$ full-response + $: id=@t + choices=(list choice) + created=@da + model=@t + object=@t :: 'chat.completion.chunk' + =usage + == + +$ usage + $: completion-tokens=@ud + prompt-tokens=@ud + total-tokens=@ud + == + +$ chunk-response + $: id=@t + choices=(list choice) + created=@da + model=@t + object=@t :: 'chat.completion.chunk' + == + +$ choice + $: index=@ud + =delta + =finish-reason + == + +$ finish-reason $?(%stop %length %content-filter %function-call ~) + +$ chunk-choice + $: index=@ud + =delta + =finish-reason + == + +$ delta + $: content=$?(@t ~) + =role + function-call=(unit function-call) + == + ++ dejs + =, dejs:format + =/ de de:json-helpers:sortug + |% + ++ full + |= jon=@t ^- full-response + %. (need (de:json:html jon)) + %- ot + :~ id+so + choices+(ar de-choice) + created+du + model+so + object+so + usage+de-usage + == + ++ de-choice + %- ot + :~ index+ni + message+de-delta + ['finish_reason' de-finish-reason] + == + ++ de-usage + %- ot + :~ ['completion_tokens' ni] + ['prompt_tokens' ni] + ['total_tokens' ni] + == + + ++ chunk + |= jon=@t ^- chunk-response + %. (need (de:json:html jon)) + %- ot + :~ id+so + choices+(ar de-chunk-choice) + created+du + model+so + object+so + == + ++ de-chunk-choice + %- ot + :~ index+ni + delta+de-delta + ['finish-reason' de-finish-reason] + == + ++ de-role %- su %- perk + :~(%system %user %assistant %function) + ++ de-finish-reason %- maybe:de %- su %- perk + :~(%stop %length %content-filter %function-call) + ++ de-delta + %- ou + :~ + content+(un (maybe:de so)) + role+(un de-role) + ['function-call' (ur:de de-function-call)] + == + ++ de-function-call + %- ot + :~ name+so + arguments+so + == + -- + ++ enjs + =, enjs:format + |_ req=request + ++ $ + %- pairs + :~ messages+a+(turn messages.req en-msg) + model+s+model.req + == + ++ en-msg + |= msg=message + %- pairs + :~ role+s+role.msg + :- %content ?~ content.msg ~ s+content.msg + == + -- + -- + ++ endpoint "/completions" + ++ request + |= req=request:t + ^- request:http + =/ method %'POST' + =/ url %- crip "{base-url}{^endpoint}{endpoint}" + =/ headers + :~ + ['Authorization' api-key] + ['Content-type' 'application/json'] + == + =/ json (enjs:t req) + ~& > req=req + ~& >> sending=(en:json:html json) + =/ body (json-to-octs:server (enjs:t req)) + [method url headers `body] + + -- +-- +:: ++ embeddings +:: |% +:: ++ endpoint "/embeddings" +:: ++ req %'POST' +:: +$ input +:: $@ @t (list @t) +:: +$ req-type +:: $: =input +:: model=@tas +:: user=(unit @t) +:: == +:: +$ res +:: $: object=@t +:: data=(list embed) +:: model=@tas +:: usage=[prompt-tokens=@ud total-tokens=@ud] +:: == +:: +$ embed +:: $: index=@ud +:: embedding=(list @rd) :: TODO make this strings? +:: object=@t :: 'embedding' +:: == +:: ++ res-dejson +:: =, dejs:format +:: %- ot +:: :~ object+so +:: model+so +:: usage+usage-dejson +:: data+(ar embed-dejson) +:: == +:: ++ usage-dejson +:: =, dejs:format +:: %- ot +:: :~ ['prompt_tokens' ni] +:: ['total_tokens' ni] +:: == +:: ++ embed-dejson +:: %- ot +:: :~ object+so +:: index+ni +:: embedding+(ar ne) :: TODO make this strings?? +:: == +:: -- +:: ++ fine-tuning +:: |% +:: ++ endpoint "/fine_tuning/jobs +:: +$ job +:: $: id=@t +:: created-at=@ud +:: error=(unit error) +:: fine-tuned-model=(unit @t) +:: finished-at=(unit @ud) +:: =hyperparameters +:: model=@tas +:: organization-id=@t +:: result-files=(list @t) +:: =status +:: trained-tokens=(unit @ud) +:: training-file=@t +:: validation-file=(unit @t) +:: == +:: +$ job-event +:: $: id=@t +:: created-at=@ +:: level=@t :: 'warn', 'info', ... +:: message=@t +:: data=(unit job) :: I think +:: type=@t :: 'message' +:: == +:: ++ job-dejson +:: =, dejs:format +:: %- ot +:: :~ id+so +:: fine-tuned-model+uso +:: finished-at+uso +:: hyperparameters+hdj +:: model=(se %tas) +:: 'organization_id'+so +:: 'result_files'+(ar so) +:: status+(se %tas) +:: 'trained_tokens'+uso +:: 'training_file'+so +:: 'validation_file'+uso +:: == +:: ++ job-event-dejson +:: %- ot +:: :~ id+so +:: level+so +:: message+so +:: data+job-dejson +:: == +:: ++ uso +:: |= j=json +:: ?~ j ~ +:: ?: ?=(-.j %s) (so j) +:: ?: ?=(-.j %n) (ni j) ~ +:: ++ hdj +:: %- ot +:: :~ :- 'n_epochs' +:: |= j=json +:: ?: ?=(-.j %s) %auto +:: ?: ?=(-.j %n) (ni j) +:: == +:: +$ events-res +:: $: data=(list job-event) +:: has-more=? +:: == +:: ++ events-res-dejson +:: =, dejs:format +:: %- ot +:: :~ data+(ar job-event-djson) +:: has-more+bo +:: == +:: +$ status $?(%validating-files %queued %running %succeeded %failed %cancelled) +:: +$ hyperparameters [%n-epochs $?(%auto @ud)] +:: ++ create +:: |% +:: ++ endpoint "" +:: ++ req %POST +:: +$ req-type +:: $: model=@tas +:: training-file=@t +:: hyperparameters=(unit hyperparameters) +:: validation-file=(unit @t) +:: suffix=(unit @t) +:: == +:: -- +:: ++ get-all +:: |_ [after=(unit @t) limit=(unit @ud)] +:: ++ endpoint +:: ?~ after +:: ?~ limit +:: :: none +:: "" +:: :: limit but not after +:: "?limit={<u.limit>}" +:: ?~ limit +:: :: after but not limit +:: "?after={(trip u.after)}" +:: :: both +:: "?limit={<u.limit>}&after={(trip u.after)}" +:: ++ req %GET +:: ++ res events-res +:: ++ dejs events-res-dejson + +:: -- +:: ++ get +:: |_ id=@t +:: ++ endpoint "/{(trip id)}" +:: ++ req %GET +:: ++ res job +:: ++ res-dejson job-dejson +:: -- +:: ++ cancel +:: |_ id=@t +:: ++ endpoint "/{(trip id)}/cancel" +:: ++ req %POST +:: ++ res job +:: ++ res-dejson job-dejson +:: -- +:: ++ get-events +:: |_ [id=@t after=(unit @t) limit=(unit @ud)] +:: :: TODO There must be a better way to handle optional query params +:: ++ endpoint "/{(trip id)}/events" +:: ++ req %GET +:: ++ res events-res +:: ++ dejs events-res-dejson +:: -- +:: -- +:: ++ files +:: |% +:: ++ endpoint "/files" +:: +$ file-type +:: $: id=@t +:: bytes=@ud +:: created-at=@ud +:: filename=@t +:: purpose=@t :: 'currently only fine-tune' +:: =status +:: status-details=(unit @t) +:: == +:: ++ dejs +:: =, dejs:format +:: %- ot +:: :~ id+so +:: bytes+ni +:: ['created_at' ni] +:: filename+so +:: purpose+so +:: == +:: +$ status $?(%uploaded %processed %pending %error %deleting %deleted) +:: ++ get-all +:: |% +:: ++ endpoint "" +:: ++ req %GET +:: +$ res (list file-type) +:: ++ dejs +:: %- ot +:: :~ data+(ar ^dejs) +:: == +:: -- +:: ++ upload +:: |_ [file=@t purpose=@t] :: file is the actual file, not the name +:: ++ endpoint "" +:: ++ req %POST :: mulipart wtf +:: +$ res file-type +:: ++ dejs ^dejs +:: -- +:: ++ delete +:: |_ file-id=@t +:: ++ endpoint "/{file-id}" +:: ++ req %DELETE +:: +$ res +:: $: id=@t +:: deleted=? +:: == +:: ++ dejs +:: =, dejs:format +:: %- ot +:: :~ it+so +:: deleted+bo +:: == +:: -- +:: ++ get +:: |_ file-id=@t +:: ++ endpoint "/{file-id}" +:: ++ req %GET +:: +$ res file-type +:: ++ dejs ^dejs +:: -- +:: ++ content +:: |_ file-id=@t +:: ++ endpoint "/{file-id}/content" +:: ++ req %GET +:: +$ res "" :: the file content +:: -- +:: -- +++ images +|% + ++ endpoint "/images" + ++ t + |% + +$ image + $% [%'b64_json' @t] + [%url @t] + == + +$ response-format $?(%url %b64-json) + +$ size $?(%'256x256' %'512x512' %'1024x1024') + +$ res + $: created=@ud + data=(list image) + == + ++ dejs + =, dejs:format + |_ jon=@t + ++ $ ^- res + %. (need (de:json:html jon)) + %- ot + :~ created+ni + data+(ar de-data) + == + ++ de-data + %- of + :~ [%'b64_json' so] + [%url so] + == + -- + -- + ++ create + |^ request + ++ t + |% + +$ req + $: prompt=@t + n=(unit @ud) + response-format=(unit response-format:^t) + size=(unit size:^t) + user=(unit @t) + == + ++ enjs + =, enjs:format + |_ =req + ++ $ + %- pairs + :- prompt+s+prompt.req + :: %- murn :_ clean + :: :~ n+n+n.req + :: ['response_format' %s response-format.req] + :: size+s+size.req + :: user+s+user.req + :: == + ~ + -- + -- + ++ endpoint "/generations" + ++ request |= =req:t + ^- request:http + =/ method %'POST' + =/ url %- crip "{base-url}{^endpoint}{endpoint}" + =/ headers + :~ + ['Authorization' api-key] + ['Content-type' 'application/json'] + == + =/ body (json-to-octs:server (enjs:t req)) + [method url headers `body] + -- + :: ++ edit + :: :: TODO guess image is alread octs once it gets here so we just send tha + :: :: images must be png, <4mb, square + :: |^ request + :: ++ t + :: |% + :: ++ req + :: $: image=@t + :: prompt=@t + :: mask=(unit @t) + :: n=(unit @ud) + :: size=(unit size) + :: response-format=(unit response-format:t) + :: user=(unit @t) + :: == + :: -- + :: ++ endpoint "/edits" + :: ++ request :: multipart + :: ^- request:http + :: =/ method %'POST' + :: =/ url %- crip "{base-url}{^endpoint}{endpoint}" + :: =/ headers + :: :~ + :: ['Authorization' api-key] + :: == + :: =/ body ~ :: can we even do multipart + :: [method url headers ~] + :: -- + :: ++ variation + :: |_ [image=@t n=(unit @ud) size=(unit size) response-format=(unit response-format) user=(unit @t)] + :: ++ endpoint "/variations" + :: ++ request :: multipart + :: ^- request:http + :: =/ method %'POST' + :: =/ url %- crip "{base-url}{^endpoint}{endpoint}" + :: =/ headers + :: :~ + :: ['Authorization' api-key] + :: == + :: =/ body ~ :: can we even do multipart + :: [method url headers ~] + :: -- +-- +:: ++ models +:: |% +:: ++ endpoint "/models" +:: ++ request +:: ^- request:http +:: =/ method %'GET' +:: =/ url %- crip "{base-url}{endpoint}" +:: =/ headers +:: :~ +:: ['Authorization' api-key] +:: == +:: [method url headers ~] +:: +$ res (list model-res) +:: +$ model-res +:: $: id=@t +:: created=@ :: unix ts +:: object=@t :: always 'model' +:: owned-by=@t :: 'openai etc.' +:: == +:: ++ res-dejson +:: =, dejs:format +:: %- ot +:: :~ object+so +:: data+(ar model-res-dejson) +:: == +:: ++ model-res-dejson +:: =, dejs:format +:: %- ot +:: :~ id+so +:: created+ni +:: object+so +:: owned-by+so +:: == +:: ++ model +:: |_ name=@t +:: ++ endpoint "/{name}" +:: ++ request +:: ^- request:http +:: =/ method %'GET' +:: =/ url %- crip "{base-url}{^endpoint}{endpoint}" +:: =/ headers +:: :~ +:: ['Authorization' api-key] +:: == +:: [method url headers ~] +:: -- +:: ++ delete-model +:: |_ name=@t +:: ++ endpoint "{name}" +:: ++ request +:: ^- request:http +:: =/ method %'DELETE' +:: =/ url %- crip "{base-url}{^endpoint}{endpoint}" +:: =/ headers +:: :~ +:: ['Authorization' api-key] +:: == +:: [method url headers ~] +:: +$ res +:: $: id=@t +:: object=@t :: 'model' +:: deleted=? +:: == +:: ++ res-dejson +:: =, dejs:format +:: %- ot +:: :~ id+so +:: object+so +:: deleted+bo +:: == +:: -- +:: -- +:: ++ moderation +:: |% +:: ++ endpoints "/moderations" +:: +$ moderation-t +:: $: id=@t +:: model=@t +:: results=(list result) +:: == +:: +$ result +:: $: flagged=? +:: =categories +:: =category-scores +:: == +:: +$ categories +:: $: sexual=? +:: hate=? +:: harassment=? +:: self-harm=? +:: sexual-minors=? +:: hate-threatening=? +:: violence-graphic=? +:: self-harm-intent=? +:: self-harm-instructions=? +:: harassment-threatening=? +:: violence=? +:: == +:: +$ category-scores +:: $: sexual=@rd +:: hate=@rd +:: harassment=@rd +:: self-harm=@rd +:: sexual-minors=@rd +:: hate-threatening=@rd +:: violence-graphic=@rd +:: self-harm-intent=@rd +:: self-harm-instructions=@rd +:: harassment-threatening=@rd +:: violence=@rd +:: == +:: ++ dejs +:: =, dejs:format +:: %- ot +:: :~ id+so +:: model+(se %tas) +:: results+(ar de-result) +:: == +:: ++ de-result +:: =, dejs:format +:: %- ot +:: :~ flagged+bo +:: categories+de-categories +:: ['category_scores' de-category-scores] +:: == +:: ++ de-categories +:: =, dejs:format +:: %- ot +:: :~ sexual+bo +:: hate+bo +:: harassment+bo +:: self-harm+bo +:: 'sexual/minors'+bo +:: 'hate/threatening'+bo +:: 'violence/graphic'+bo +:: 'self-harm/intent'+bo +:: 'self-harm/instructions'+bo +:: 'harassment/threatening'+bo +:: violence+bo +:: == +:: ++ de-category-scores +:: =, dejs:format +:: %- ot +:: :~ sexual+ne +:: hate+ne +:: harassment+ne +:: self-harm+ne +:: 'sexual/minors'+ne +:: 'hate/threatening'+ne +:: 'violence/graphic'+ne +:: 'self-harm/intent'+ne +:: 'self-harm/instructions'+ne +:: 'harassment/threatening'+ne +:: violence+ne +:: == +:: ++ create +:: |_ =req +:: ++ endpoint "" +:: ++ request +:: ^- request:http +:: =/ method %'POST' +:: =/ url %- crip "{base-url}{^endpoint}{endpoint}" +:: =/ headers +:: :~ +:: ['content-type' 'application/json'] +:: ['Authorization' api-key] +:: == +:: =/ body (json-to-octs:server (enjs req)) +:: [method url headers `body] +:: +$ input $@ @t (list @t) +:: +$ model $?(%text-moderation-stable %text-moderation-latest) +:: +$ req +:: $: =input +:: model=(unit model) +:: == +:: ++ enjs +:: =, enjs:format +:: %- pairs +:: :~ input+s+(en-input input.req) +:: == +:: ++ en-input +:: =, enjs:format +:: ?^ input.req a+(turn input |=(s=@t s+s)) +:: s+input +:: +$ res moderation-t +:: ++ dejs ^dejs +:: -- +:: -- + +-- + diff --git a/desk/lib/p.hoon b/desk/lib/p.hoon new file mode 100644 index 0000000..8806410 --- /dev/null +++ b/desk/lib/p.hoon @@ -0,0 +1,65 @@ +|% +++ dinfix |* [pf=rule sf=rule] +=/ neither (star ;~(less ;~(pose pf sf) next)) +;~(pfix pf ;~(sfix neither sf)) +++ infix +|* =rule +(ifix [rule rule] (star ;~(less rule next))) ++$ block +$% [%p p=paragraph] + [%blockquote p=paragraph] + [%list p=(list paragraph) ordered=?] + [%tasklist p=(list task)] + [%heading p=paragraph h=?(%h1 %h2 %h3 %h4 %h5 %h6)] + [%table rows=(list (list paragraph))] + [%codeblock code=@t lang=@t] +== ++$ paragraph (list inline) ++$ task [text=paragraph done=?] ++$ inline +$% [%b p=paragraph] + [%i p=paragraph] + [%del p=paragraph] :: strikethrough + [%a href=@t text=@t] + [%img src=@t alt=@t] + [%codespan p=@t] + [%footnote id=@t text=paragraph] + [%br ~] + [%text p=@t] +== +++ brk (just '\0a') +:: ++ words (cook (crip zing (star word))) :: indefinite tarp +++ tics ;~(plug tic tic tic brk) +++ white (plus ace) :: whitespace +++ bq ;~(pfix ;~(plug gar ace) (plus inli)) +++ blok + ;~ pose + (stag %blockquote bq) + (stag %p (plus inli)) + == +++ inli + ;~ pose + :: *bold* + (stag %b (infix tar)) + (cold [%br ~] brk) + (stag %text (star next)) + :: _italic_ + :: (stag %i (ifix cab)) + :: :: `code` + :: (stag %codespan (ifix tic)) + :: :: [li](nk) + :: %+ stag %link + :: ;~ plug + :: (dinfix [sel ser]) + :: (dinfix [pal par]) + :: == + :: ::  + :: %+ stag %mage + :: ;~ pfix zap + :: ;~ plug + :: (dinfix [sel ser]) + :: (dinfix [pal par]) + :: == + :: == + == +--
\ No newline at end of file diff --git a/desk/lib/post.hoon b/desk/lib/post.hoon new file mode 100644 index 0000000..a0816da --- /dev/null +++ b/desk/lib/post.hoon @@ -0,0 +1,236 @@ +/- post=trill-post +|% +++ node-to-full +|= [p=post:post f=feed:post] ^- full-node:post +p(children (convert-children children.p f)) +++ convert-children +|= [children=(set id:post) f=feed:post] +^- full-graph:post +%- ~(rep in children) + |= [=id:post acc=full-graph:post] + =/ n (get:orm:post f id) + ?~ n acc + =/ full-node (node-to-full u.n f) + (put:form:post acc id full-node) +++ sanitize +|= c=contents:contents-1:post ^- ? +%+ roll c |= [i=block:contents-1:post acc=_&] +?. ?=(%paragraph -.i) acc +%+ roll p.i |= [ii=inline:contents-1:post iacc=_acc] +?. ?=(%link -.ii) iacc +?~ (de-purl:html href.ii) .n .y +++ block-size +|= =block:contents-1:post +?- -.block +%tasklist 0 :: TODO +%paragraph (inline-size p.block) +%blockquote (inline-size p.block) +%heading (lent (trip p.block)) +%list (inline-size p.block) +%media (media-size media.block) +%codeblock +?: (gth (lent (trip lang.block)) 400) 10.000 +(lent (trip code.block)) +%eval (lent (trip hoon.block)) +%ref +?: (gth (lent (trip app.block)) 400) 10.000 +(roll path.block |=([i=@t a=@] (add a (lent (trip i))))) +%json +?: (gth (lent (trip content.block)) 5.000) 10.000 +?: (gth (lent (trip origin.block)) 1.000) 10.000 +0 +%table +%+ roll rows.block |= [i=(list contents:contents-1:post) a=@] +=/ inner-count=@ +%+ roll i |= [ii=contents:contents-1:post ia=@] +(add ia (post-size ii)) +(add inner-count a) +== +++ post-size +|= c=contents:contents-1:post +=| count=@ +|- +?~ c count +=/ lc=@ (block-size i.c) +$(c t.c, count (add count lc)) +++ inline-token-size +|= i=inline:contents-1:post ^- @ud +?+ -.i (lent (trip p.i)) +%break 1 +%date 1 +%note (add (met 3 id.i) 10):: TODO) +%ship (lent (trip (scot %p p.i))) +%ruby (lent (trip p.i)) +%link +?: (gth (lent (trip href.i)) 400) 10.000 :: to prevent hacking through a huge href string +(lent (trip show.i)) +== +++ reduce-inline +|= [i=inline:contents-1:post chars=@ud] ^+ i +?- -.i +%break i +%date i +%note i :: TODO +%ship [%text (crip (weld (scag chars (trip (scot %ud p.i))) "..."))] +%ruby i(p (crip (scag chars (trip p.i)))) +%link i(show (crip (scag chars (trip show.i)))) +%bold + [-.i (crip (scag chars (trip +.i)))] +%codespan + [-.i (crip (scag chars (trip +.i)))] +%italic + [-.i (crip (scag chars (trip +.i)))] +%strike + [-.i (crip (scag chars (trip +.i)))] +%sub + [-.i (crip (scag chars (trip +.i)))] +%sup + [-.i (crip (scag chars (trip +.i)))] +%text + [-.i (crip (weld (scag chars (trip +.i)) "..."))] +%underline + [-.i (crip (scag chars (trip +.i)))] +== +++ inline-size +|= l=(list inline:contents-1:post) ^- @ +=| count=@ud +|- + ?~ l count + =/ lc=@ud (inline-token-size i.l) + $(l t.l, count (add count lc)) + + +++ media-size +|= =media:contents-1:post ^- @ +?- -.media +%video (lent (trip p.media)) +%audio (lent (trip p.media)) +%images %+ roll p.media +|= [[url=@t caption=@t] a=@] +%+ add a (add (met 3 url) (met 3 caption)) +== + +++ search +|= [q=@t p=post:post] ^- ? +=/ latest=content-list:post val:head:(pop:corm:post contents.p) +=/ in-tags %+ roll ~(tap in tags.p) |= [i=cord a=_|] +?: (contains i q) %& a +=/ in-blocks %+ roll latest |= [i=block:contents-1:post a=_|] +?: ?- -.i + %paragraph (in-inline p.i q) + %blockquote (in-inline p.i q) + %list (in-inline p.i q) + %heading (contains p.i q) + %codeblock (contains code.i q) + %eval (contains hoon.i q) + %json (contains content.i q) + %media (in-media media.i q) + %ref %| :: TODO + %table %| :: TODO + %tasklist .n :: TODO +== %& a +?| in-tags in-blocks == +++ contains +|= [container=cord query=cord] ^- ? +?~ (find (trip query) (trip container)) %| %& +++ in-media +|= [=media:contents-1:post q=@t] ^- ? +?. ?=(%images -.media) (contains p.media q) +%+ roll p.media |= [[url=cord caption=cord] a=_|] +?: ?| (contains url q) (contains caption q) == .y a +++ in-inline +|= [l=(list inline:contents-1:post) q=@t] ^- ? +%+ roll l |= [i=inline:contents-1:post a=_|] +?: ?+ -.i (contains p.i q) +%break %| +%ship (contains (scot %p p.i) q) +%date .n :: TODO +%note ?|((contains id.i q) (in-inline text.i q)) +%link ?|((contains href.i q) (contains show.i q)) +%ruby ?|((contains p.i q) (contains q.i q)) +== %& a +++ is-my-reply +|= [p=post:post r=post:post our=@p] ^- ? +?~ parent.r .n +?& .=(author.r our) !.=(author.p our) == +++ is-thread-child +|= [p=post:post r=post:post our=@p] ^- ? +?~ parent.r .n +?& .=(author.r our) .=(author.p our) == +++ houyi +|= fn=full-node:post ^- @ud +?~ children.fn 0 +=/ lst (tap:form:post children.fn) +%+ add (lent lst) +%+ roll lst +|= [[=id:post n=full-node:post] acc=@ud] +(add acc (houyi n)) + +:: +++ abbreviate-post +|= [cm=content-map:post max-chars=@ud] ^- content-list:post + =/ c (latest-contents cm) + :: we reduce the list of blocks. We count how many characters are there in each block. + :: If the block fits in our count, we insert the block in the filtered list. + :: If not, we cut the content of the box until it does. + =/ ret=content-list:post + =< +< + %^ spin c [bl=*content-list:post available=max-chars] + |= [b=block:contents-1:post [bl=_c available=@ud]] + :: We must return the same data type as the input + :: We don't want to map on the individual block so return as is + :- b + :: The state tho is what we're playing with. + :: We pass the current block and the available char count to another function + =/ cut=[(unit block:contents-1:post) @ud] (cut-block b available) + :: That function checks whether the block fits within the available count. + :: It returns a maybe block and the remaining count + :: If null, we return the list as is + ?~ -.cut [bl available] + :: If we get a block back, we add that to our block list, and update the available count + [[u.-.cut bl] +.cut] + (flop ret) +++ cut-block +:: now let's go inside the block +|= [b=block:contents-1:post available=@ud] +^- [(unit block:contents-1:post) @ud] +?+ -.b [~ 0] +:: :: This we can cut +%paragraph =/ inlines (cut-inlines p.b available) +?~ -.inlines [~ available] :- `[-.b -.inlines] +.inlines +:: :: these must go whole or nothing +:: :: %blockquote +:: :: %heading +:: :: %list +:: :: %media +:: :: %eval +:: :: %poll +:: :: %ref +:: :: %json +:: :: %table +== +++ cut-inlines +|= [li=(list inline:contents-1:post) available=@ud] ^+ [li available] +?: .=(0 available) [~ 0] +:: We spin again +=/ ret=[_li @ud] +=/ initial-state [*(list inline:contents-1:post) available] +=< + +%^ spin li initial-state +|= [l=inline:contents-1:post [nl=_li available=@ud]] +:: Again we're not mapping over the tokens, just mutating an internal state +:- l +:: If no more chars available we return of course +?: .=(0 available) [nl available] +:: We look at the size of the current token +=/ size (inline-token-size l) +:: If the size is smaller than available, we add to new list, and substract from available +?: (lte size available) +[[l nl] (sub available size)] +:: If size is bigger than available we reduce the token, insert to list, set avaibable as 0 +=/ reduced (reduce-inline l available) +[[reduced nl] 0] + +[(flop -.ret) +.ret] + +-- diff --git a/desk/lib/rails.hoon b/desk/lib/rails.hoon new file mode 100644 index 0000000..8db842e --- /dev/null +++ b/desk/lib/rails.hoon @@ -0,0 +1,7 @@ +|% ++$ response +$% [%page hed=header-list:http bod=manx] :: html page with headers + [%full p=simple-payload:http] + [%error code=@ud msg=@t] :: codes 400-500+ + [%redirect loc=@t] +--
\ No newline at end of file diff --git a/desk/lib/rout.hoon b/desk/lib/rout.hoon new file mode 100644 index 0000000..a818ec6 --- /dev/null +++ b/desk/lib/rout.hoon @@ -0,0 +1,53 @@ +/+ *sortug +|% ++$ card card:agent:gall ++$ eyre-poke [id=@da req=inbound-request:eyre] +:: our paths are particular ++$ paeth (list @t) ++$ req-path [=method:http paeth] ++$ route-map (map req-path simple-payload:http) ++$ data [=order state=mold] +:: I'd rather it can be a non-simple payload but whatever ++$ route $-(inbound-request route-end) +++ de-path +:: modified from apat:de-purl:html +=/ delim ;~(pose fas dot) +%+ cook :: get rid of the last dot and make the extension a part of the path +|= l=paeth ^+ l +=/ acc [nl=*_l i=1] +%^ spin l acc +|= [e=@t a=acc] +:- e :_ +(i) +:: only change the last one +?. .=(i (lent l)) a.a +(rash last (csplit dot)) +;~(pfix fas (more fas smeg:de-purl:html)) + +++ parse-url-path + |= url=@t + ^- request-line + (fall (rush url ;~(plug de-path yque:de-purl:html)) [[~ ~] ~]) +++ $ =state + |* state-type=mold + +=/ met method.request.req.order +=/ req-line (parse-request-line url.request.req.order) +=/ pth=path :- met site.req-line +?+ pth :_ state (serve-404 req-line) + [%'GET' ~ ~] :_ state (serve-index req-line) :: "/" + [%'GET' @ @ @ @ *] :_ state (serve-post site.req-line) + [%'POST' *] (handle-post req-line body.request.req.order state) + :: [%get %blog *] serve-blog + :: [%get 'chat' *] serve-chat + :: [%get 'forum' *] serve-forum + :: [%get 'about' *] serve-about +== + +:: The api we want is +(route eyre-poke route-map state bowl) +:: route-map is ++ +:: and from that we get +[(list card) simple-payload:http _state] +which the router itself resolves to (quip card _state) +--
\ No newline at end of file diff --git a/desk/lib/rudder.hoon b/desk/lib/rudder.hoon new file mode 100644 index 0000000..45eaf30 --- /dev/null +++ b/desk/lib/rudder.hoon @@ -0,0 +1,285 @@ +:: rudder: framework for routing & serving simple web frontends +:: +:: v1.0.2: newborn helmsman +:: +:: the primary usage pattern involves your app calling steer:rudder +:: with a configuration, then calling the resulting gate with an +:: incoming request and relevant context. +:: +:: %. [bowl [eyre-id inbound-request] dat] +:: %- (steer:rudder _dat cmd) +:: [pages route adlib solve] +:: +:: dat is app state passed into and transformed by the frontend code. +:: cmd is the type of app actions that the frontend may produce. +:: pages is a (map term (page _dat cmd)), contains per-view frontend logic. +:: route is a routing function, turning a url query into a $place. +:: adlib gets called with the full request when no route is found. +:: solve is a function that applies a cmd resulting from a POST request. +:: +:: the library provides some default implementations for route and adlib, +:: which you can construct using +point and +fours respectively. +:: +:: for examples and a more detailed description of handling http requests, +:: see /lib/rudder/poke-example.hoon +:: +:: pages implement a bundle of view logic, each implementing a door +:: with three arms. +:: +:: +build gets called for GET requests, producing a $reply to render. +:: +argue gets called for POST requests, turning it into a cmd. +:: +final gets called after POST requests, producing a $reply to render. +:: +:: for examples and a more detailed description of implementing a page, +:: see /lib/rudder/page-example.hoon +:: +::TODO +:: - should rudder really be falling back to generic error messages when +:: calling +final after failure? what if apps/pages want to provide +:: their own generic error message? +:: - in the full-default setup, the behavior of +alert is a little bit +:: awkward. because +point forces routes to omit trailing slashes, +:: you cannot refer to "the current page" in a consistent way. +:: you have to either hardcode the page name, or pass the full url +:: from the inbound-request. +:: a router that forces inclusion of trailing slashes would let you +:: use '.', but has unconventional url semantics, and doesn't mesh +:: nicely with single-level routing. +:: - some inconsistency between the expected output of +adlib and +solve. +:: "briefless" +solve results may be common, so it's nice that they're +:: easy to write. for +adlib that probably isn't as relevant, and +:: the current factoring makes for a nice =^ in the lib code, but... +:: on the other hand, they're still different output types semantically, +:: so inconsistency isn't the end of the world. would have to see how +:: this ends up looking in practice. +:: - +argue is awkward because its function signature doesn't really work +:: if the cmd type is an atom. +:: - maybe unsupported methods should go to the fallback too? +:: - currently ambiguous: do you catch would-fail actions during +argue, +:: or in +solve? might be best to catch earlier, but this splits +:: or duplicates business logic between app and pages... +:: +|% ++| %types :: outputs, inputs, function signatures +:: ++$ reply + $% [%page bod=manx] :: html page + [%xtra hed=header-list:http bod=manx] :: html page w/ heads + [%next loc=@t msg=brief] :: 303, succeeded + [%move loc=@t] :: 308, use other + [%auth loc=@t] :: 307, please log in + [%code cod=@ud msg=brief] :: error code page + [%full ful=simple-payload:http] :: full payload + == +:: ++$ place + $% [%page ath=? nom=term] :: serve from pages + [%away loc=(list @t)] :: 308, redirect + == +:: ++$ query + $: trail + args=(list [key=@t value=@t]) + == +:: ++$ trail + [ext=(unit @ta) site=(list @t)] +:: ++$ order [id=@ta inbound-request:eyre] ++$ route $-(trail (unit place)) ++$ brief ?(~ @t) +:: +++ page + |* [dat=mold cmd=mold] + $_ ^| + |_ [bowl:gall order dat] + ++ build |~([(list [k=@t v=@t]) (unit [? @t])] *reply) + ++ argue |~([header-list:http (unit octs)] *$@(brief cmd)) + ++ final |~([success=? msg=brief] *reply) + -- +:: ++$ card card:agent:gall +:: pilot: core server logic +:: ++| %pilot +:: +++ steer :: main helper constructor + |* [dat=mold cmd=mold] + |^ serve + +$ page (^page dat cmd) + +$ adlib $-(order [[(unit reply) (list card)] dat]) + +$ solve $-(cmd $@(brief [brief (list card) dat])) + :: + ++ serve :: main helper + |= [pages=(map @ta page) =route =adlib =solve] + |= [=bowl:gall =order =dat] + ^- (quip card _dat) + =* id id.order + =+ (purse url.request.order) + =/ target=(unit place) + (route -<) + :: if there is no route, fall back to adlib + :: + ?~ target + =^ [res=(unit reply) caz=(list card)] dat + (adlib order) + :_ dat + ?~ res caz + (weld (spout id (paint u.res)) caz) + :: route might be a redirect + :: + ?: ?=(%away -.u.target) + =+ (rap 3 '/' (join '/' loc.u.target)) + [(spout id (paint %move -)) dat] + :: route might require authentication + :: + ?: &(ath.u.target !authenticated.order) + [(spout id (paint %auth url.request.order)) dat] + :: route might have messed up and pointed to nonexistent page + :: + ?. (~(has by pages) nom.u.target) + [(spout id (issue 404 (cat 3 'no such page: ' nom.u.target))) dat] + :: + %. [bowl order dat] + (apply (~(got by pages) nom.u.target) solve) + :: + ++ apply :: page usage helper + |= [=page =solve] + |= [=bowl:gall =order =dat] + ^- (quip card _dat) + =. page ~(. page bowl order dat) + =* id id.order + ?+ method.request.order + [(spout id (issue 405 ~)) dat] + :: + %'GET' + :_ dat + =+ (purse url.request.order) + =^ msg args + ::NOTE as set by %next replies + ?~ msg=(get-header:http 'rmsg' args) [~ args] + [`[& u.msg] (delete-header:http 'rmsg' args)] + %+ spout id + (paint (build:page args msg)) + :: + %'POST' + ?@ act=(argue:page [header-list body]:request.order) + :_ dat + =? act ?=(~ act) 'failed to parse request' + (spout id (paint (final:page | act))) + ?@ res=(solve act) + :_ dat + =? act ?=(~ act) 'failed to process request' + (spout id (paint (final:page | res))) + :_ +>.res + =. +<+>.page +>.res + (weld (spout id (paint (final:page & -.res))) +<.res) + == + -- +:: easy: hands-off steering behavior +:: ++| %easy +:: +++ point :: simple single-level routing, +route + |= [base=(lest @t) auth=? have=(set term)] + ^- route + |= trail + ^- (unit place) + ?~ site=(decap base site) ~ + ?- u.site + ~ `[%page auth %index] + [~ ~] `[%away (snip ^site)] + [%index ~] `[%away (snip ^site)] + [@ ~] ?:((~(has in have) i.u.site) `[%page auth i.u.site] ~) + [@ ~ ~] `[%away (snip ^site)] + * ~ + == +:: +++ fours :: simple 404 responses, +adlib + |* dat=* + :: ^- adlib:(rest * _dat) + |= * + [[`[%code 404 'no route found'] ~] dat] +:: +++ alert :: simple redirecting +final handler + |= [next=@t build=$-([(list [@t @t]) (unit [? @t])] reply)] + |= [done=? =brief] + ^- reply + ?: done [%next next brief] + (build ~ `[| `@t`brief]) +:: cargo: payload generation +:: ++| %cargo +:: +++ paint :: render response + |= =reply + ^- simple-payload:http + ?- -.reply + %page [[200 ['content-type' 'text/html']~] `(press bod.reply)] + %xtra =? hed.reply ?=(~ (get-header:http 'content-type' hed.reply)) + ['content-type'^'text/html' hed.reply] + [[200 hed.reply] `(press bod.reply)] + %next =; loc [[303 ['location' loc]~] ~] + ?~ msg.reply loc.reply + %+ rap 3 + :~ loc.reply + ?:(?=(^ (find "?" (trip loc.reply))) '&' '?') + 'rmsg=' + (crip (en-urlt:html (trip msg.reply))) + == + %move [[308 ['location' loc.reply]~] ~] + %auth =/ loc (crip (en-urlt:html (trip loc.reply))) + [[307 ['location' (cat 3 '/~/login?redirect=' loc)]~] ~] + %code (issue +.reply) + %full ful.reply + == +:: +++ issue :: render status code page + |= [cod=@ud msg=brief] + ^- simple-payload:http + :- [cod ~] + =; nom=@t + `(as-octs:mimes:html (rap 3 ~[(scot %ud cod) ': ' nom '\0a' msg])) + ?+ cod '' + %400 'bad request' + %404 'not found' + %405 'method not allowed' + %500 'internal server error' + == +:: utils: fidgeting +:: ++| %utils +:: +++ decap :: strip leading base from full site path + |= [base=(list @t) site=(list @t)] + ^- (unit (list @t)) + ?~ base `site + ?~ site ~ + ?. =(i.base i.site) ~ + $(base t.base, site t.site) +:: +++ frisk :: parse url-encoded form args + |= body=@t + %- ~(gas by *(map @t @t)) + (fall (rush body yquy:de-purl:html) ~) +:: +::NOTE the below (and $query) are also available in /lib/server.hoon, +:: but we reimplement them here for independence's sake. +:: +++ purse :: url cord to query + |= url=@t + ^- query + (fall (rush url ;~(plug apat:de-purl:html yque:de-purl:html)) [[~ ~] ~]) +:: +++ press :: manx to octs + (cork en-xml:html as-octt:mimes:html) +:: +++ spout :: build full response cards + |= [eyre-id=@ta simple-payload:http] + ^- (list card) + =/ =path /http-response/[eyre-id] + :~ [%give %fact ~[path] [%http-response-header !>(response-header)]] + [%give %fact ~[path] [%http-response-data !>(data)]] + [%give %kick ~[path] ~] + == +--
\ No newline at end of file diff --git a/desk/lib/seq.hoon b/desk/lib/seq.hoon new file mode 100644 index 0000000..12f8d26 --- /dev/null +++ b/desk/lib/seq.hoon @@ -0,0 +1,1809 @@ +:: /lib/seq/hoon +:: |seq +:: operations for working with values of type list +:: +|% +:: +all-pairs: [(list T1) (list T2)] -> (list [T1 T2]) +:: +:: Returns a new list that contains all pairings of elements from two non-empty +:: lists. +:: Examples +:: > (all-pairs ~['a' 'b' 'c'] ~[1 2 3]) +:: ~[['c' 3] ['c' 2] ['c' 1] +:: ['b' 3] ['b' 2] ['b' 1] +:: ['a' 3] ['a' 2] ['a' 1]] +:: Source +++ all-pairs + |* [p=(list) q=(list)] + =/ a=(list _?>(?=(^ p) i.p)) p + =/ res=(list [_?>(?=(^ p) i.p) _?>(?=(^ q) i.q)]) ~ + =/ scnd=(list _?>(?=(^ q) i.q)) q + |- ^- (list [_?>(?=(^ p) i.p) _?>(?=(^ q) i.q)]) + ?~ a res + ?~ scnd $(a t.a, scnd q) + $(res [[i.a i.scnd] res], scnd +.scnd) +:: +append: [(list) (list)] -> (list) +:: +:: Returns a new list that contains the elements of the first list followed by +:: elements of the second list. +:: Examples +:: > (append "urb" "it") +:: "urbit" +:: > (append (limo [1 2 ~]) (limo [3 4 ~])) +:: ~[1 2 3 4] +:: Source +++ append weld +:: +average: (list @) -> @ud +:: +:: Returns the average of the values in a non-empty list. +:: Examples +:: > (average `(list @ud)`~[1 2 3 4]) +:: 2 +:: Source +++ average + |* a=(list @) + (div (roll a add) (lent a)) +:: +average-by: [(list T) projection:$-(T @ud)] -> @ud +:: +:: Returns the average of values in a list generated by applying a function to +:: each element of the list. +:: Examples +:: > (average-by (limo ~[[1 1] [2 2] [3 3] [4 4]]) |=([a=@ b=@] (add a b))) +:: 5 +:: Source +++ average-by + |* [a=(list) b=$-(* @ud)] + (div (roll (turn a b) add) (lent a)) +:: +choose: [(list T1) $-(T1 (unit T2))] -> (list T2) +:: +:: Applies a function to each element in a list and then returns a list of +:: values v where the applied function returns (unit v). +:: Returns an empty list when the input list is empty or when the applied +:: chooser function returns ~ for all elements. +:: Examples +:: > =a |=(a=@ ?.((gte a 2) ~ (some (add a 10)))) +:: > (choose `(list @)`[0 1 2 3 ~] a) +:: [i=12 t=[i=13 t=~]] +:: Source +++ choose murn +:: +chunk-by-size: [(list T) chunkSize:@] -> (list (list T)) +:: +:: Divides the input list into lists (chunks) with a positive number of at +:: most chunkSize elements. Returns a new list containing the generated lists +:: (chunks) as its elements. Returns an empty list when the input list is empty +:: Examples +:: > (chunk-by-size (limo ~[1 2 3 4 5 6 7]) 2) +:: [i=~[1 2] t=[i=~[3 4] t=~[~[5 6] ~[7]]]] +:: Crash +:: 'chunk size is 0' +:: Source +++ chunk-by-size + |* [p=(list) q=@ud] + ?: =(0 q) ~|('chunk size is 0' !!) + =/ res=(list (list _?>(?=(^ p) i.p))) ~ + =/ i=@ud 0 + =/ next=(list _?>(?=(^ p) i.p)) ~ + |- ^- (list (list _?>(?=(^ p) i.p))) + ?~ p (flop [(flop next) res]) + ?: =(i q) $(i 0, res [(flop next) res], next ~) + $(i +(i), next [i.p next], p t.p) +:: +collect: [(list T1) mapping:$-(T1 (list T2))] -> (list T2) +:: +:: For each element of the list, applies the given function. Concatenates all +:: the results and return the combined list. +:: Examples +:: > (collect (limo ~[1 2 3]) |=(a=* (limo ~[a a]))) +:: ~[1 1 2 2 3 3] +:: Source +++ collect + |* [p=(list) q=$-(* (list))] + =/ res=(list) ~ + |- + ?~ p (flop res) + =/ c=(list) (q i.p) + |- + ?~ c ^$(p t.p) + $(c t.c, res [i.c res]) +:: +compare: [(list T) (list T) comparer:$-([T T] ?)] -> (list ?) +:: +:: Compares two lists element by element using the given comparison function. +:: When an entry exists for both lists, returns the result of the comparer +:: function. When the second list is longer than the first returns %.y for +:: entries of second where first does not exist. When first list is longer +:: returns %.n for entries of first where second does not exist. +:: Examples +:: > (compare "when" "than" aor) +:: ~[%.n %.y %.n %.y] +:: Source +++ compare + |* [b=(list) c=(list) a=$-([* *] ?)] + =/ res=(list ?) ~ + =/ bb b + =/ cc c + |- ^- (list ?) + ?~ bb ?~ cc (flop res) $(cc t.cc, res [%.y res]) + ?~ cc $(bb t.bb, res [%.n res]) + $(bb t.bb, cc t.cc, res [(a i.bb i.cc) res]) +:: +concat: (list (list)) -> (list) +:: +:: Returns a new list that contains the elements of each of the lists in order. +:: Examples +:: > (concat (limo [(limo ['a' 'b' 'c' ~]) (limo ['e' 'f' 'g' ~]) +:: (limo ['h' 'i' 'j' ~]) ~])) +:: ~['a' 'b' 'c' 'e' 'f' 'g' 'h' 'i' 'j'] +:: > (concat (limo [(limo [1 'a' 2 'b' ~]) (limo [3 'c' 4 'd' ~]) ~])) +:: ~[1 97 2 98 3 99 4 100] +:: Source +++ concat zing +:: +contains: [(list) value:*] -> ? +:: +:: Tests if the list contains the specified element. +:: Examples +:: > (contains "yep" `(list tape)`~["nope" "yep"]) +:: %.y +:: Source +++ contains + |* [p=(list) q=*] + |- ^- ? + ?~ p %.n + ?: =(q i.p) %.y + $(p t.p) +:: +count-by: [(list T1) projection:$-(T1 T2)] -> (list [T2 @ud]) +:: +:: Applies a key-generating function to each element of a list and returns a +:: list yielding unique keys and their number of occurrences in the original +:: list. +:: Examples +:: > %: count-by +:: (limo ~["where" "when" "there" "then"]) +:: |=(a=tape (scag 2 a)) +:: == +:: ~[[[i=t' t="h"] 2] [[i='w' t="h"] 2]] +:: Source +++ count-by + |* [p=(list) q=$-(* *)] + =/ res=(map _?>(?=(^ p) (q i.p)) @ud) ~ + |- ^- (list [_?>(?=(^ p) (q i.p)) @ud]) + ?~ p ~(tap by res) + =/ key=_?>(?=(^ p) (q i.p)) (q i.p) + =/ val (~(get by res) key) + ?~ val $(res `(map _?>(?=(^ p) (q i.p)) @ud)`(~(put by res) key 1), p t.p) + %= $ + res `(map _?>(?=(^ p) (q i.p)) @ud)`(~(put by res) key +(`@ud`(need val))) + p t.p + == +:: +distinct: (list) -> (list) +:: +:: Returns a list that contains no duplicate entries according to generic hash +:: and equality comparisons on the entries. If an element occurs multiple times +:: in the list then the later occurrences are discarded. +:: Examples +:: > (distinct `(list tape)`~["tape1" "tape0" "tape1" "tape0"]) +:: ~["tape1" "tape0"] +:: Source +++ distinct + |* a=(list) + =/ b=(list _?>(?=(^ a) i.a)) ~ + =/ c=(set) ~ + |- ^+ a + ?~ a (flop b) + ?: (~(has in c) i.a) $(a t.a) + $(a t.a, b [i.a b], c (~(put in c) i.a)) +:: +distinct-by: [(list T1) projection:$-(T1 T2)] -> (list T1) +:: +:: Returns a list that contains no duplicate entries according to the generic +:: hash and equality comparisons on the keys returned by the given +:: key-generating function. If an element occurs multiple times in the list +:: then the later occurrences are discarded. +:: Examples +:: > =foo `(list [@ @])`~[[1 1] [1 2] [1 3] [2 1]] +:: > (distinct-by foo |=([a=@ b=@] (add a b))) +:: ~[[1 1] [1 2] [1 3]] +:: Source +++ distinct-by + |* [p=(list) q=$-(* *)] + =/ b=(list _?>(?=(^ p) i.p)) ~ + =/ c=(set) ~ + |- ^+ p + ?~ p (flop b) + ?: (~(has in c) (q i.p)) $(p t.p) + $(p t.p, b [i.p b], c (~(put in c) (q i.p))) +:: +empty: $ -> *(list $) +:: +:: Returns an empty list typed by the mold. (The bunt of the typed list.) +:: Examples +:: > (empty @t) +:: ~ +:: Source +++ empty + |* a=mold + *(list a) +:: +exactly-one: (list T) -> T +:: +:: Returns the only element of the list. Crashes if list has different length. +:: Examples +:: > (exactly-one (limo ~["tape"])) +:: "tape" +:: Crash +:: 'list length is not 1' +:: Source +++ exactly-one + |* a=(list) + ?: =(1 (lent a)) -.a + ~|('list length is not 1' !!) +:: +except: [(list T) items-to-exclude:(list T)] -> (list T) +:: +:: Returns a new list with the distinct elements of the input list which do not +:: appear in the items-to-exclude list, using generic hash and equality +:: comparisons to compare values. +:: Examples +:: > %: except +:: (limo ~["able" "baker" "charlie" "dog"]) +:: (limo ~["baker" "dog"]) +:: == +:: ~[[i='a' t="ble"] [i='c' t="harlie"]] +:: Source +++ except + |* [p=(list) q=(list)] + =/ qq (silt q) + =/ b=(list _?>(?=(^ p) i.p)) ~ + |- ^+ p + ?~ p (flop b) + ?: (~(has in qq) i.p) $(p t.p) + $(p t.p, b [i.p b], qq (~(put in qq) i.p)) +:: +exists: [(list T) predicate:$-(T ?)] -> ? +:: +:: Tests if any element of the list satisfies the given predicate. +:: Examples +:: > =foo |= a=tape +:: ?: ?&(=(4 (lent a)) =('a' -.a)) %.y %.n +:: > (exists (limo ~["aaa" "able" "baker" "charlie" "dog"]) foo) +:: %.y +:: Source +++ exists + |* [a=(list) b=$-(* ?)] + |- ^- ? + ?~ a %.n + ?: (b i.a) %.y + $(a t.a) +:: +exists2: [(list T1) (list T2) predicate:$-([T1 T2] ?)] -> ? +:: +:: Tests if any pair of corresponding elements of the lists satisfies the given +:: predicate. +:: Examples +:: > =foo |= [a=tape b=tape] +:: ?: =(-.a -.b) %.y %.n +:: > (exists2 (limo ~["cat" "betty"]) (limo ~["able" "butter"]) foo) +:: %.y +:: Source +++ exists2 + |* [a=(list) b=(list) c=$-([* *] ?)] + |- ^- ? + ?~ a %.n + ?~ b %.n + ?: (c [i.a i.b]) %.y + $(a t.a, b t.b) +:: +filter: [(list T) predicate:$-(T ?)] -> (list T) +:: +:: Returns a new list containing only the elements of the list for +:: which the given predicate returns "true" +:: Examples +:: > =a |=(a=@ (gth a 1)) +:: > (filter `(list @)`[0 1 2 3 ~] a) +:: [i=2 t=~[3]] +:: Source +++ filter skim +:: +:: +findx: [(list T) predicate:$-(T ?)] -> T +:: +:: Returns the first element for which the given function returns True. +:: Crashes if no such element exists. +:: Examples +:: > (findx (gulf [1 30]) |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5))))) +:: 15 +:: Crash +:: 'not found' +:: Source +++ findx + |* [a=(list) b=$-(* ?)] + |- ^- _?>(?=(^ a) i.a) + ?~ a ~|('not found' !!) + ?: (b i.a) i.a $(a t.a) +:: +find-all: [(list T) predicate:$-(T ?)] -> (list T)) +:: +:: Returns all elements for which the given function returns True. +:: Crashes if no such element exists. +:: Examples +:: > (find-all (gulf [1 30]) |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5))))) +:: ~[15 30] +:: Crash +:: 'not found' +:: Source +++ find-all + |* [a=(list) b=$-(* ?)] + =/ c=(list _?>(?=(^ a) i.a)) ~ + |- + ?~ a ?~ c ~|('not found' !!) (flop c) + ?: (b i.a) $(a t.a, c [i.a c]) $(a t.a) +:: +find-all-by-list: [(list T) arg:(list T) -> (list @)] +:: +:: Produces list of indices of all occurrences of the argument list sequence in +:: the sequence of the source list. +:: Examples +:: > (find-all-by-list "cbabab" "ba") +:: ~[1 3] +:: Source +++ find-all-by-list + |* [hstk=(list) nedl=(list)] + ^- (list @) + (fand nedl hstk) +:: +find-all-by-unit: [(list T1) chooser:$-(T1 (unit T2))] -> (list T2) +:: +:: Applies the given function to successive elements, returning the list of +:: elements where the function returns Some(x). +:: Crashes when no such element exists. +:: Examples +:: > %: find-all-by-unit +:: (limo ~[1 2 3 4]) +:: |=(a=@ ?:(=((mod a 2) 0) `a ~)) +:: == +:: ~[2 4] +:: Crash +:: 'not found' +:: Source +++ find-all-by-unit + |* [hstk=(list) nedl=$-(* (unit *))] + =/ b=(list _?>(?=(^ hstk) i.hstk)) ~ + |- ^- (list _?>(?=(^ hstk) i.hstk)) + ?~ hstk ?~ b ~|('not found' !!) + (flop b) + =/ x (nedl i.hstk) + ?~ x $(hstk t.hstk) + $(hstk t.hstk, b [(need x) b]) +:: +find-back: [(list T) predicate:$-(T ?)] -> T +:: +:: Returns the last element for which the given function returns True. +:: Crashes if no such element exists. +:: Examples +:: > %: find-back +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: 30 +:: Crash +:: 'not found' +:: Source +++ find-back + |* [a=(list) b=$-(* ?)] + ?~ a ~|('not found' !!) + (findx (flop a) b) +:: +find-back-by-list: [(list T) arg:(list T)] -> @ +:: +:: Produces the index of the last occurrence of the argument list sequence in +:: the sequence of the source list. +:: Examples +:: > (find-back-by-list "cbabab" "ba") +:: 3 +:: Source +++ find-back-by-list + |* [hstk=(list) nedl=(list)] + (tail-end (find-all-by-list hstk nedl)) +:: +find-back-by-unit: [(list T1) chooser:$-(T1 (unit T2))] -> T2 +:: +:: Applies the given function to successive elements from the end back, +:: returning the first result where function returns Some(x) for some x. +:: Crashes when no such element exists. +:: Examples +:: > %: find-back-by-unit +:: (limo ~[1 2 3 4]) +:: |=(a=@ ?:(=((mod a 2) 0) `a ~)) +:: == +:: 4 +:: Crash +:: 'not found' +:: Source +++ find-back-by-unit + |* [hstk=(list) nedl=$-(* (unit *))] + ^- _?>(?=(^ hstk) i.hstk) + (find-by-unit (flop hstk) nedl) +:: +find-by-list: [(list T) arg:(list T)] -> @ +:: +:: Produces the index of the first occurrence of the argument list sequence in +:: the sequence of the source list. +:: Examples +:: > (find-by-list "cbabab" "ab") +:: 2 +:: Crash +:: 'not found' +:: Source +++ find-by-list + |* [hstk=(list) nedl=(list)] + ^- @ + =/ x (find nedl hstk) + ?~ x ~|('not found' !!) (need x) +:: +find-by-unit: [(list T1) chooser:$-(T1 (unit T2))] -> T2 +:: +:: Applies the given function to successive elements, returning the first +:: result where function returns Some(x) for some x. Crashes when no such +:: element exists. +:: Examples +:: > (find-by-unit (limo ~[1 2 3 4]) |=(a=@ ?:(=((mod a 2) 0) `a ~))) +:: 2 +:: Crash +:: 'not found' +:: Source +++ find-by-unit + |* [hstk=(list) nedl=$-(* (unit *))] + |- ^- _?>(?=(^ hstk) i.hstk) + ?~ hstk ~|('not found' !!) + =/ x (nedl i.hstk) + ?~ x $(hstk t.hstk) + (need x) +:: +find-index: [(list T) predicate:$-(T ?)] -> @ +:: +:: Returns the index of the first element in the list that satisfies the given +:: predicate. Crashes if no such element exists. +:: Examples +:: > %: find-index +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: 14 +:: Crash +:: 'not found' +:: Source +++ find-index + |* [a=(list) b=$-(* ?)] + =/ i 0 + |- ^- @ + ?~ a ~|('not found' !!) + ?: (b i.a) i $(a t.a, i +(i)) +:: +find-index-all: [(list T) predicate:$-(T ?)] -> (list @) +:: +:: Returns the list of indices in the list that satisfies the given predicate. +:: Examples +:: > %: find-index-all +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: ~[14 29] +:: Source +++ find-index-all + |* [a=(list) b=$-(* ?)] + =/ c=(list @) ~ + =/ i 0 + |- ^- (list @) + ?~ a (flop c) + ?: (b i.a) $(a t.a, c [i c], i +(i)) $(a t.a, i +(i)) +:: +find-index-back: [(list T) predicate:$-(T ?)] -> @ +:: +:: Returns the index of the last element in the list that satisfies the given +:: predicate. Crashes if no such element exists. +:: Examples +:: > %: find-index-back +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: 29 +:: Crash +:: 'not found' +:: Source +++ find-index-back + |* [a=(list) c=$-(* ?)] + ?~ a ~|('not found' !!) + =/ b (flop a) + =/ i (dec (lent a)) + |- ^- @ud + ?~ b ~|('not found' !!) + ?: (c i.b) i + ?: =(0 i) ~|('not found' !!) + $(b t.b, i (dec i)) +:: +first-n: [(list T) count:@ud] -> (list T) +:: +:: Returns the first N elements of the list. +:: Examples +:: > (first-n `(list @)`[1 2 3 4 ~] 2) +:: [i=1 t=~[2]] +:: > (first-n `(list @)`[1 2 3 4 ~] 10) +:: [i=1 t=~[2 3 4]] +:: Source +++ first-n + |* [p=(list) q=@] + (scag q p) +:: +fold: [(list T1) state:T2 folder:$-([T1 T2] T2)] -> T2 +:: +:: Applies a function to each element of the list, threading an +:: accumulator argument through the computation. Take the second argument, and +:: apply the function to it and the first element of the list. Then feed this +:: result into the function along with the second element and so on. Return the +:: final result. If the input function is f and the elements are i0...iN then +:: computes f (... (f s i0) i1 ...) iN. +:: Examples +:: > (fold (gulf 1 5) 0 |=([n=@ state=@] (add state (mul n n)))) +:: 55 +:: Source +++ fold + |* [a=(list) b=* c=_|=(^ [** +<+])] + |- ^- _b + ?~ a b + $(a t.a, b (c i.a b)) +:: +fold2: [(list T1) (list T2) state:T3 folder:$-([T1 T2 T3] T3)] -> T3 +:: +:: Applies a function to corresponding elements of two lists, threading +:: an accumulator argument through the computation. The lists must have +:: identical sizes. If the input function is f and the elements are i0...iN and +:: j0...jN then computes f (... (f s i0 j0)...) iN jN. +:: Examples +:: > %: fold2 +:: (limo ~["Tails" "Head" "Tails"]) +:: (limo ~["Tails" "Head" "Head"]) +:: 0 +:: |=([n1=tape n2=tape state=@] ?:(=(n1 n2) +(state) state)) +:: == +:: 2 +:: Crash +:: 'lists of unequal length' +:: Source +++ fold2 + |* [a=(list) b=(list) c=* d=_|=(^ [** ** +<+])] + |- ^- _c + ?~ a ?~ b c ~|('lists of unequal length' !!) + ?~ b ~|('lists of unequal length' !!) + $(a t.a, b t.b, c (d i.a i.b c)) +:: +fold-back: [(list T1) state:T2 folder:$-([T1 T2] T2)] -> T2 +:: +:: Applies a function to each element of the list, starting from the end, +:: threading an accumulator argument through the computation. If the input +:: function is f and the elements are i0...iN then computes f i0 (...(f iN s)). +:: Examples +:: > =less-hungry |= [n=tape state=(list [tape @])] +:: ^+ state +:: ?~ state (limo ~[[n 1]]) +:: [[n +(+.i.state)] state] +:: > %: fold-back +:: (limo ~["Apple" "Pear" "Orange"]) +:: `(list [tape @])`~ +:: less-hungry +:: == +:: [i=["Apple" 3] t=~[["Pear" 2] ["Orange" 1]]] +:: Source +++ fold-back + |* [a=(list) b=* c=$-([* *] *)] + (fold (flop a) b c) +:: +fold-back2: [(list T1) (list T2) state:T3 folder:$-([T1 T2 T3] T3)] -> T3 +:: +:: Applies a function to corresponding elements of two lists, threading +:: an accumulator argument through the computation. The lists must have +:: identical sizes. If the input function is f and the elements are i0...iN and +:: j0...jN then computes f i0 j0 (...(f iN jN s)). +:: Examples +:: > %: fold-back2 +:: (limo ~["Tails" "Head" "Tails"]) +:: (limo ~["Tails" "Head" "Head"]) +:: `(list tape)`~ +:: |=([n1=tape n2=tape state=(list tape)] [(weld n1 n2) state]) +:: == +:: ~["TailsTails" "HeadHead" "TailsHead"] +:: Source +++ fold-back2 + |* [a=(list) b=(list) c=* d=$-([* * *] *)] + (fold2 (flop a) (flop b) c d) +:: +forall: [(list T) predicate:$-(T ?)] -> ? +:: +:: Tests if all elements of the list satisfy the given predicate. +:: Examples +:: > (forall (limo ~[2 4 8]) |=(a=@ ?:(=(0 (mod a 2)) %.y %.n))) +:: %.y +:: > (forall (limo ~[2 1 8]) |=(a=@ ?:(=(0 (mod a 2)) %.y %.n))) +:: %.n +:: Source +++ forall + |* [a=(list) predicate=$-(* ?)] + |- ^- ? + ?~ a %.y + ?. (predicate i.a) %.n + $(a t.a) +:: +forall2: [(list T1) (list T2) predicate:$-([T1 T2] ?)] -> ? +:: +:: Tests if all corresponding elements of the list satisfy the given +:: predicate pairwise. Crashes on lists of unequal length +:: Examples +:: > %: forall2 +:: (limo ~[1 4 8]) +:: (limo ~[3 4 8]) +:: |=([a=@ b=@] ?:(=(0 (mod (add a b) 2)) %.y %.n)) +:: == +:: %.y +:: > %: forall2 +:: (limo ~[1 5 8]) +:: (limo ~[3 4 8]) +:: |=([a=@ b=@] ?:(=(0 (mod (add a b) 2)) %.y %.n)) +:: == +:: %.n +:: Crash +:: 'lists of unequal length' +:: Source +++ forall2 + |* [a=(list) b=(list) predicate=$-(* ?)] + ?. =((lent a) (lent b)) ~|('lists of unequal length' !!) + |- ^- ? + ?~ a %.y + ?~ b ~|('cant get here' !!) + ?. (predicate i.a i.b) %.n + $(a t.a, b t.b) +:: +from-map: (map) -> (list [* *]) +:: +:: Produces the list of all key element pairs in map. +:: Examples +:: > =map-00 (to-map (limo ~[['aa' 1] ['bb' 2] ['cc' 3] ['dd' 4]])) +:: > (from-map map-00) +:: ~[[p='bb' q=2] [p='dd' q=4] [p='cc' q=3] [p='aa' q=1]] +:: Source +++ from-map + |* a=(map) + ~(tap by a) +:: +from-set: -> (list) +:: +:: Produces the list of element in set +:: Examples +:: > (from-set `(set tap)`[[n="tlon"] l=["urbit" ~ ~] r=["uqbar" ~ ~]]) +:: Source +++ from-set + |* a=(set) + ~(tap in a) +:: +get-head: (list T) -> T +:: +:: Returns the first element of the list. Crashes on empty list. +:: Examples +:: > (get-head ~[1 2]) +:: 1 +:: Crash +:: 'empty list' +:: Source +++ get-head + |* a=(list) + ?~ a ~|('empty list' !!) + i.a +:: +get-tail: (list T) -> (list T) +:: +:: Returns the list after removing the first element. +:: Examples +:: > (get-tail ~[1 2]) +:: ~[2] +:: Crash +:: 'empty list' +:: Source +++ get-tail + |* a=(list) + ?~ a ~|('empty list' !!) + t.a +:: +group-by: [(list T1) projection:$-(T1 T2)] -> (list [T2 (list T1)]) +:: +:: Applies a key-generating function to each element of a list and yields a +:: list of unique keys. Each unique key contains a list of all elements that +:: match to this key. +:: Examples +:: > (group-by (gulf 1 5) |=(a=@ (mod a 2))) +:: ~[[p=0 q=[i=4 t=~[[2 0]]]] [p=1 q=[i=5 t=~[[3 [1 0] 0]]]]] +:: Source +++ group-by + |* [a=(list) b=$-(* *)] + =/ d=(map * (list *)) ~ + |- + ?~ a ~(tap by d) + =/ e (b i.a) + =/ f (~(get by d) e) + ?~ f $(a t.a, d (~(put by d) e ~[i.a])) + $(a t.a, d (~(put by d) e ~[i.a (need f)])) +:: +indexed: (list T) -> (list [@ T]) +:: +:: Returns a new list whose elements are the corresponding elements of the +:: input list paired with the index (from 0) of each element. +:: Examples +:: > (indexed (gulf 1 3)) +:: ~[[0 1] [1 2] [2 3]] +:: Source +++ indexed + |* a=(list) + =/ b=(list [@ _?>(?=(^ a) i.a)]) ~ + =/ i 0 + |- ^- (list [@ _?>(?=(^ a) i.a)]) + ?~ a (flop b) + $(a t.a, b [[i i.a] b], i +(i)) +:: +init: [length:@ud initializer:$-(@ud T)] -> (list T) +:: +:: Creates a list by calling the given generator on each index. +:: Crashes on length = 0. +:: Examples +:: > (init 3 |=(a=@ (add a 5))) +:: ~[6 7 8] +:: Crash +:: 'empty list' +:: Source +++ init + |* [len=@ ini=$-(@ *)] + =/ a=(list *) ~ + ?: =(0 len) ~|('empty list' !!) + |- + ?: =(0 len) a + $(len (dec len), a [(ini len) a]) +:: +insert-at: [(list T) index:@ value:T] -> (list T) +:: +:: Return a new list with a new item inserted before the given index. +:: Examples +:: > (insert-at (limo ~[2 3 4]) 1 11) +:: ~[2 11 3 4] +:: Source +++ insert-at into +:: +insertManyAt: [(list T) values=(list T) index=@] -> (list T) +:: +:: Return a new list with new items inserted before the given index. +:: Examples +:: > (insert-many-at (limo ~[1 2 5 6 7]) (limo ~[3 4]) 2) +:: ~[1 2 3 4 5 6 7] +:: Crash +:: 'out of range' +:: Source +++ insert-many-at + |* [a=(list) values=(list) i=@] + ?: =(0 (lent values)) a + =/ len-a (lent a) + ?: (gth i len-a) ~|('out of range' !!) + ?~ values a + ?: =(0 i) (weld values a) + ?: =(len-a i) (weld a values) + =/ start (scag i a) + =/ end (slag i a) + (weld (weld start values) end) +:: +is-empty: (list) -> ? +:: +:: Returns true if the list contains no elements, false otherwise. +:: Examples +:: > (is-empty `(list @)`~[2]) +:: %.n +:: > (is-empty `(list @)`~) +:: %.y +:: Source +++ is-empty + |* a=(list) + ?~ a %.y %.n +:: +item: [(list T) index:@] -> T +:: +:: Indexes into the list. The first element has index 0. +:: Examples +:: > (item `(list @)`~["aa" "bb" "cc" "dd"] 2) +:: "cc" +:: Source +++ item + |* [a=(list) i=@] + (snag i a) +:: +iter: [(list T) fun:$-(T *)] -> ~ +:: +:: Applies the given function to each element of the list, dropping the +:: results. +:: Examples +:: > (iter (limo ~["tape1" "tape2"]) |=(a=tape (lent a))) +:: ~ +:: Source +++ iter + |* [a=(list) fun=$-(* *)] + =/ b (turn a fun) + ~ +:: +iter2: [(list T1) (list T2) fun:$-(T1 T2 *)] -> ~ +:: +:: Applies the given function to two lists simultaneously, dropping the +:: results. The lists must have identical size. +:: Examples +:: > %: iter2 +:: (limo ~["tape1" "tape2"]) +:: (limo ~["tape3" "tape4"]) +:: |=([a=tape b=tape] (add (lent a) (lent b))) +:: == +:: ~ +:: Crash +:: 'lists of unequal length' +:: Source +++ iter2 + |* [a=(list) b=(list) fun=$-(* *)] + =/ b (map2 a b fun) + ~ +:: +iteri: [(list T) fun:$-([@ T] *)] -> ~ +:: +:: Applies the given function to each element of the list and the index +:: of element, dropping the results. +:: Examples +:: > (iteri (limo ~[1 2 3]) |=([a=@ b=@] (add a b))) +:: ~ +:: Source +++ iteri +|* [a=(list) fun=$-(* *)] + =/ b (mapi a fun) + ~ +:: +iteri2: [(list T1) (list T2) fun:$-(@ T1 T2 *)] -> ~ +:: +:: Applies the given function to two lists and the current index, +:: dropping the results. The lists must have identical size. +:: Examples +:: > %: iteri2 +:: (limo ~[1 2 3]) +:: (limo ~[4 5 6]) +:: |=([a=@ b=@ c=@] (add (add a b) c)) +:: == +:: ~ +:: Crash +:: 'lists of unequal length' +:: Source +++ iteri2 + |* [a=(list) b=(list) fun=$-(* *)] + =/ b (mapi2 a b fun) + ~ +:: +last-n: [(list T) count:@] -> (list T) +:: +:: Returns the last N elements of the list. +:: Examples +:: > (last-n `(list @)`[1 2 3 4 ~] 2) +:: [i=3 t=~[4]] +:: > (last-n `(list @)`[1 2 3 4 ~] 10) +:: [i=1 t=~[2 3 4]] +:: Source +++ last-n + |* [p=(list) q=@] + (flop (scag q (flop p))) +:: +length: (list T) -> @u +:: +:: Returns the length of the list. +:: Examples +:: > (length [1 2 3 4 ~]) +:: 4 +:: > (length [1 'a' 2 'b' (some 10) ~]) +:: 5 +:: Source +++ length lent +:: +map-seq: [(list T1) mapping:$-(T1 T2)] -> (list T2) +:: +:: Builds a new list whose elements are the results of applying the given +:: gate to each of the elements of the list. +:: Examples +:: > (map (limo [104 111 111 110 ~]) @t) +:: <|h o o n|> +:: > =a |=(a=@ (add a 4)) +:: > (map (limo [1 2 3 4 ~]) a) +:: ~[5 6 7 8] +:: Source +++ map-seq turn +:: +map2: [(list T1) (list T2) mapping:$-([T1 T2] T3)] -> (list T3) +:: +:: Builds a new list whose elements are the results of applying the given +:: function to the corresponding elements of the two lists pairwise. +:: Crashes if lists are of unequal length +:: Examples +:: > (map2 (limo ~[1 2 3 4]) (limo ~[5 6 7 8]) |=(a=[@ @] (add -.a +.a))) +:: ~[6 8 10 12] +:: Crash +:: 'lists of unequal length' +:: Source +++ map2 + |* [a=(list) b=(list) c=gate] + =/ d=(list) ~ + |- + ?~ a ?~ b (flop d) ~|('lists of unequal length' !!) + ?~ b ~|('lists of unequal length' !!) + $(a t.a, b t.b, d [(c i.a i.b) d]) +:: +map3: [(list T1) (list T2) (list T3) $-([T1 T2 T3] T4)] -> (list T4) +:: +:: Builds a new list whose elements are the results of applying the given +:: function to the corresponding elements of the three lists +:: simultaneously. +:: Examples +:: > %: map3 +:: (limo ~[1 2 3 4]) +:: (limo ~[5 6 7 8]) +:: (limo ~[9 10 11 12]) +:: |=(a=[@ @ @] (add (add -.a +<.a) +>.a)) +:: == +:: ~[15 18 21 24] +:: Crash +:: 'lists of unequal length' +:: Source +++ map3 + |* [a=(list) b=(list) c=(list) d=gate] + =/ e=(list) ~ + |- + ?~ a ?~ b ?~ c (flop e) + ~|('lists of unequal length' !!) + ~|('lists of unequal length' !!) + ?~ b ~|('lists of unequal length' !!) + ?~ c ~|('lists of unequal length' !!) + $(a t.a, b t.b, c t.c, e [(d i.a i.b i.c) e]) +:: +map-fold: [(list T1) state:T2 $-([T1 T2] [T3 T2])] -> [(list T3) T2] +:: +:: Combines map and fold. Builds a new list whose elements are the results of +:: applying the given function to each of the elements of the input list. The +:: function is also used to accumulate a final value. +:: Examples +:: > =input `(list [@t @])`~[['in' 1] ['out' 2] ['in' 3]] +:: > =foo |* [p=[@t @] state=@] +:: ^- [[@t @] @] +:: ?: =(-.p 'in') [['in' (mul +.p 2)] (add state +.p)] +:: [['out' (mul +.p 2)] (mul state +.p)] +:: > (map-fold input 0 foo) +:: [~[['in' 2] ['out' 4] ['in' 6]] 5] +:: Source +++ map-fold spin +:: +map-fold-back: [(list T1) state:T2 $-([T1 T2] [T3 T2])] -> [(list T3) T2] +:: +:: Combines map and foldBack. Builds a new list whose elements are the results +:: of applying the given function to each of the elements of the input list, +:: starting from the end. +:: The function is also used to accumulate a final value. +:: Examples +:: > =input `(list [@t @])`~[['in' 1] ['out' 2] ['in' 3]] +:: > =foo |* [p=[@t @] state=@] +:: ^- [[@t @] @] +:: ?: =(-.p 'in') [['in' (mul +.p 2)] (add state +.p)] +:: [['out' (mul +.p 2)] (mul state +.p)] +:: > (map-fold-back input 0 foo) +:: [~[['in' 6] ['out' 4] ['in' 2]] 7] +:: Source +++ map-fold-back + |* [a=(list) state=* c=$-([* *] [* *])] + (spin (flop a) state c) +:: +mapi: [(list T1) mapping:$-([@ T1] T2)] -> (list T2) +:: +:: Builds a new list whose elements are the results of applying the given +:: function to each of the elements of the list. The integer index passed +:: to the function indicates the index (from 0) of element being transformed. +:: Examples +:: > (mapi (limo ~[1 2 3]) |=([a=@ b=@] (add a b))) +:: ~[1 3 5] +:: Source +++ mai + |* [a=(list) b=gate] + =| i=@ud + => .(a (homo a)) + ^- (list _?>(?=(^ a) (b i i.a))) + |- + ?~ a ~ + :- i=(b i i.a) + t=$(a t.a, i +(i)) +++ mapi + |* [a=(list) fun=$-([@ *] *)] + =/ i 0 + =/ b=(list) ~ + |- + ?~ a (flop b) + $(a t.a, b [(fun i i.a) b], i +(i)) +:: +mapi2: [(list T1) (list T2) mapping:$-([@ T1 T2] T3)] -> (list T3) +:: +:: Like mapi, but mapping corresponding elements from two lists of equal length. +:: Examples +:: > %: mapi2 +:: (limo ~[1 2 3]) +:: (limo ~[4 5 6]) +:: |=([a=@ b=@ c=@] (add (add a b) c)) +:: == +:: ~[5 8 11] +:: Crash +:: 'lists of unequal length' +:: Source +++ mapi2 + |* [a=(list) b=(list) fun=$-([@ * *] *)] + =/ i 0 + =/ c=(list) ~ + |- + ?~ a ?~ b (flop c) ~|('lists of unequal length' !!) + ?~ b ~|('lists of unequal length' !!) + $(a t.a, b t.b, c [(fun i i.a i.b) c], i +(i)) +:: +maxi: (list T) -> T +:: +:: Return the greatest of all elements of the list, compared via Operators.max. +:: Examples +:: > (maxi (limo ~[10 12 11])) +:: 12 +:: > (maxi (limo ~["max" "add" "busy"])) +:: Crash +:: 'empty list' +:: Source +++ maxi + |* a=(list) + ~| 'empty list' + =/ m -.a + |- + ?~ a m + ?: (aor m i.a) $(m i.a, a t.a) + $(a t.a) +:: +maxBy: [(list T) projection:$-(* *)] -> T +:: +:: Returns the greatest of all elements of the list, compared via Operators.max +:: on the function result. +:: Examples +:: > (max-by (limo ~["aa" "mmmm" "zzz"]) |=(a=tape (lent a))) +:: "mmmm" +:: Crash +:: 'empty list' +:: Source +++ max-by + |* [a=(list) q=$-(* *)] + ~| 'empty list' + =/ m -.a + |- + ?~ a m + ?: (aor (q m) (q i.a)) $(m i.a, a t.a) + $(a t.a) +:: +mini: (list T) +:: +:: Returns the lowest of all elements of the list, compared via Operators.min. +:: Examples +:: > (mini (limo ~[11 12 10])) +:: 10 +:: > (mini (limo ~["min" "add" "busy"])) +:: "add" +:: Crash +:: 'empty list' +:: Source +++ mini + |* a=(list) + ~| 'empty list' + =/ m -.a + |- + ?~ a m + ?. (aor m i.a) $(m i.a, a t.a) + $(a t.a) +:: +minBy: (list T) projection +:: +:: Returns the lowest of all elements of the list, compared via Operators.min +:: on the function result +:: Examples +:: > (min-by (limo ~["aa" "mmmm" "zzz"]) |=(a=tape (lent a))) +:: "aa" +:: Crash +:: 'empty list' +:: Source +++ min-by + |* [a=(list) q=$-(* *)] + ~| 'empty list' + =/ m -.a + |- + ?~ a m + ?. (aor (q m) (q i.a)) $(m i.a, a t.a) + $(a t.a) +:: +pairwise: (list T) -> (list [T T]) +:: +:: Returns a list of each element in the input list and its predecessor, with +:: the exception of the first element which is only returned as the predecessor +:: of the second element. +:: Examples +:: > (pairwise (limo ~[1 2 3 4])) +:: ~[[1 2] [2 3] [3 4]] +:: Source +++ pairwise + |* a=(list) + =/ b=(list [_?>(?=(^ a) i.a) _?>(?=(^ a) i.a)]) ~ + |- + ?: (lth (lent a) 2) (flop b) + ?~ a ~|('cant get here' !!) + ?~ t.a ~|('cant get here' !!) + $(a t.a, b [[i.a i.t.a] b]) +:: +partition: [(list T) predicate:$-( T ?)] -> [(list T) (list T)] +:: +:: Splits the list into two lists, containing the elements for +:: which the given predicate returns True and False respectively. Element order +:: is preserved in both of the created lists. +:: Examples +:: > =a |=(a=@ (gth a 1)) +:: > (partition `(list @)`[0 1 2 3 ~] a) +:: [p=[i=2 t=~[3]] q=[i=0 t=~[1]]] +:: Source +++ partition skid +:: +permute: [(list T) projection:$-(@ @)] -> (list T) +:: +:: Returns a list with all elements permuted according to the permutation +:: specified by operating on the element indices. +:: Examples +:: > (permute (limo ~[1 2 3 4]) |=(i=@ (mod +(i) 4))) +:: ~[4 1 2 3] +:: Source +++ permute + |* [a=(list) q=$-(@ @)] + =/ b=(list [@ _?>(?=(^ a) i.a)]) ~ + =/ i 0 + |- + ?~ a +:(unzip (sort b aor)) + $(a t.a, b [[(q i) i.a] b], i +(i)) +:: +reduce: [(list T) reduction:$-([T T] T)] -> T +:: +:: Apply a function to each element of the list, threading an accumulator +:: argument through the computation. Apply the function to the first two +:: elements of the list. Then feed this result into the function along with the +:: third element and so on. Return the final result. If the input function is f +:: and the elements are i0...iN then computes f (... (f i0 i1) i2 ...) iN. +:: Examples +:: > %+ reduce +:: `(list tape)`~["urbit" "is" "fun"] +:: |=([a=tape b=tape] (welp (snoc a ' ') b)) +:: "urbit is fun" +:: Crash +:: 'empty list' +:: Source +++ reduce + |* [a=(list) q=$-([* *] *)] + ?~ a ~|('empty list' !!) + =/ b `_?>(?=(^ a) i.a)`i.a + =/ c t.a + |- + ?~ c b + $(b (q b i.c), c t.c) +:: +reduceBack: [(list T) reduction:$-([T T] T)] -> T +:: +:: Applies a function to each element of the list, starting from the end, +:: threading an accumulator argument through the computation. If the input +:: function is f and the elements are i0...iN then computes +:: f i0 (...(f iN-1 iN)). +:: Examples +:: > %+ reduce-back +:: `(list tape)`~["urbit" "is" "fun"] +:: |=([a=tape b=tape] (welp (snoc a ' ') b)) +:: "fun is urbit" +:: Crash +:: 'empty list' +:: Source +++ reduce-back + |* [a=(list) q=$-([* *] *)] + (reduce (flop a) q) +:: +remove-at: [(list T) index:@] -> (list T) +:: +:: Return a new list with the item at a given index removed. +:: Examples +:: > (remove-at "good day, urbit!" 8) +:: "good day urbit!" +:: > (remove-at `(list @)`[1 2 3 4 ~] 2) +:: ~[1 2 4] +:: Crash +:: 'out of range' +:: Source +++ remove-at + |* [a=(list) i=@] + ?: (gte i (lent a)) ~|('out of range' !!) + (oust [i 1] a) +:: +remove-many-at: [(list T) index=@ count=@] -> (list T) +:: +:: Return a new list with the number of items starting at a given index removed +:: Examples +:: > (remove-many-at "good day, urbit!" [4 5]) +:: "good urbit!" +:: > (remove-many-at `(list @)`[1 2 3 4 ~] [2 2]) +:: ~[1 2] +:: Crash +:: 'out of range' +:: Source +++ remove-many-at + |* [a=(list) i=@ c=@] + ?: (gth (add i c) (lent a)) ~|('out of range' !!) + (oust [i c] a) +:: +replicate: [count=@ initial=T] -> (list T) +:: +:: Creates a list by replicating the given initial value. +:: Examples +:: > (replicate 20 %a) +:: ~[%a %a %a %a %a %a %a %a %a %a %a %a %a %a %a %a %a %a %a %a] +:: > (replicate 5 ~s1) +:: ~[~s1 ~s1 ~s1 ~s1 ~s1] +:: > `@dr`(roll (replicate 5 ~s1) add) +:: ~s5 +:: Source +++ replicate reap +:: +reverse: (list T) -> (list T) +:: +:: Returns a new list with the elements in reverse order. +:: Examples +:: > =a [1 2 3 ~] +:: > (flop a) +:: ~[3 2 1] +:: > (flop (flop a)) +:: ~[1 2 3] +:: Source +++ reverse flop +:: +scanx: [(list T1) state:T2 folder:$-([T1 T2] T2)] -> (list T2) +:: +:: Applies a function to each element of the list and an accumulator, threading +:: the accumulator argument through the computation. Returns the list of +:: intermediate results and the final result. +:: Examples +:: > %: scanx +:: `(list tape)`~["urbit" "is" "fun"] +:: "" +:: |=([a=tape b=tape] (welp (snoc b ' ') a)) +:: == +:: ~["" " urbit" "urbit is" " urbit is fun"] +:: Source +++ scanx + |* [a=(list) state=* fun=$-([* *] *)] + =/ b=(list _state) ~ + |- ^- (list _?>(?=(^ a) i.a)) + ?~ a (flop [state b]) + $(a t.a, b [state b], state (fun i.a state)) +:: +scan-back: [(list T) state:T2 folder:$-(T1 T2)] -> (list T2) +:: +:: Like fold-back, but returns both the intermediary and final results +:: Examples +:: Source +++ scan-back + |* [a=(list) state=* fun=$-([* *] *)] + =/ c=(list _?>(?=(^ a) i.a)) (flop a) + =/ b=(list _state) ~ + |- ^- (list _?>(?=(^ a) i.a)) + ?~ c (flop [state b]) + $(c t.c, b [state b], state (fun i.c state)) +:: +singleton: value: T -> (list T) +:: +:: Returns a list that contains one item only. +:: Examples +:: > (singleton "tape") +:: ~["tape"] +:: Source +++ singleton + |* a=* + (limo ~[a]) +:: +skip-n: [(list T) count:@] -> (list T) +:: +:: Returns the list after removing the first N elements. +:: Examples +:: > (skip-n `(list @)`[1 2 3 4 ~] 2) +:: ~[3 4] +:: Crash +:: 'out of range' +:: Source +++ skip-n + |* [p=(list) q=@] + ?~ p ?~ q p ~|('out of range' !!) + ?~ q p + $(p t.p, q (dec q)) +:: +skip-while: [(list T) predicate:$-(T ?)] -> (list T) +:: +:: Bypasses elements in a list while the given predicate returns True, and then +:: returns the remaining elements of the list. +:: Examples +:: > %: skip-while +:: (limo ~["a" "bbb" "cc" "d"]) +:: |=(a=tape (lth (lent a) 3)) +:: == +:: ~["bbb" "cc" "d"] +:: Source +++ skip-while + |* [a=(list) b=$-(* ?)] + =/ c=(list _?>(?=(^ a) i.a)) ~ + |- ^+ a + ?~ a (flop c) + ?~ c ?: (b i.a) $(a t.a) $(a t.a, c [i.a c]) + $(a t.a, c [i.a c]) +:: +sort-by: [(list T) projection:$-(T *)] -> (list T) +:: +:: Sorts the given list using keys given by the given projection. Keys are +:: compared using Operators.compare. +:: Examples +:: > (sort-by (limo ~["bb" "a" "dddd" "ccc"]) |=(a=tape (lent a))) +:: ~["a" "bb" "ccc" "dddd"] +:: Source +++ sort-by + |* [a=(list) proj=$-(* *)] + =/ b (turn a proj) + =/ c (zip b a) + +:(unzip (sort c aor)) +:: +sort-by-descending: [(list T) projection:$-(T *)] -> (list T) +:: +:: Sorts the given list in descending order using keys given by the given +:: projection. Keys are compared using Operators.compare. +:: Examples +:: > %: sort-by-descending +:: (limo ~["bb" "a" "dddd" "ccc"]) |=(a=tape (lent a)) +:: == +:: ~["dddd" "ccc" "bb" "a"] +:: Source +++ sort-by-descending + |* [a=(list) proj=$-(* *)] + =/ b (turn a proj) + =/ c (zip b a) + +:(unzip (sort c |=([a=* b=*] (aor b a)))) +:: +sort-descending: (list T) -> (list T) +:: +:: Sorts the given list in descending order using Operators.compare. +:: Examples +:: > (sort-descending (limo ~[4 2 1 3])) +:: ~[4 3 2 1] +:: Source +++ sort-descending + |* a=(list) + (sort a |=([a=* b=*] (aor b a))) +:: +sort-qik: (list T) -> (list T) +:: +:: Sorts the given list in ascending order using Operators.compare. +:: Examples +:: > (sort-qik (limo ~[4 2 1 3])) +:: ~[1 2 3 4] +:: Source +++ sort-qik + |* a=(list) + (sort a aor) +:: +split-at: [(list T) index:@] -> [(list T) (list T)] +:: +:: Splits a list into two lists, at the given index. +:: Examples +:: > (split-at (limo ~[1 2 3 4 5]) 2) +:: [~[1 2] ~[3 4 5]] +:: Source +++ split-at + |* [p=(list) i=@] + [(scag i p) (slag i p)] +:: +split-into: [(list T) count:@] -> (list (list T)) +:: +:: Splits the input list into at most count chunks. +:: Examples +:: > (split-into (gulf 1 10) 4) +:: Crash +:: 'count is 0' +:: Source +++ split-into + |* [a=(list) i=@] + ?~ i ~|('count is 0' !!) + =/ b=(list (list _?>(?=(^ a) i.a))) ~ + |- + ?: =(0 (lent a)) (flop b) + =/ q (div (lent a) i) + =/ r (mod (lent a) i) + =/ l ?: =(0 r) q +(q) + =/ c=(list _?>(?=(^ a) i.a)) ~ + |- + ?~ l ^$(b [(flop c) b], i (dec i)) + ?~ a ?~ c (flop b) (flop [(flop c) b]) + $(c [i.a c], l (dec l), a t.a) +:: +sum: (list @) -> @ +:: +:: Returns the sum of the elements in the list. +:: Examples +:: > (sum (limo ~[1 2 3])) +:: 6 +:: Source +++ sum + |* a=(list @) + =/ b=@ 0 + |- + ?~ a b + $(a t.a, b (add b i.a)) +:: +sum-by: [(list T) projection:$-(T @)] -> @ +:: +:: Returns the sum of the results generated by applying the function to each +:: element of the list. +:: Examples +:: > (sum-by (limo ~["a" "bb" "ccc"]) |=(a=tape (lent a))) +:: 6 +:: Source +++ sum-by + |* [a=(list) proj=$-(* @)] + =/ b=@ 0 + |- + ?~ a b + $(a t.a, b (add b (proj i.a))) +:: +tail-end: (list T) -> T +:: +:: Returns the last element of the list. +:: Crash when the input does not have any elements. +:: Examples +:: > (last ~[1 2 3]) +:: 3 +:: Crash +:: 'empty list' +:: Source +++ tail-end + |* a=(list) + ?~ a ~|('empty list' !!) + (rear a) +:: +take-while: [(list T) predicate:$-(T ?)] -> (list T) +:: +:: Returns a list that contains all elements of the original list while the +:: given predicate returns True, and then returns no further elements. +:: Examples +:: > %: take-while +:: (limo ~["a" "bb" "ccc" "d"]) +:: |=(a=tape (lth (lent a) 3)) +:: == +:: ~["a" "bb"] +:: Source +++ take-while + |* [a=(list) b=$-(* ?)] + =/ c=(list _?>(?=(^ a) i.a)) ~ + |- ^+ a + ?~ a (flop c) + ?: (b i.a) $(a t.a, c [i.a c]) + (flop c) +:: +to-map: (list [* *]) -> +:: +:: Produces a map from a list. +:: Examples +:: > (to-map (limo ~[['aa' 1] ['bb' 2] ['cc' 3] ['dd' 4]])) +:: [n=[p='dd' q=4] l=[n=[p='cc' q=3] l=[n=[p='aa' q=1] l=~ r=~] r=~] +:: r=[n=[p='bb' q=2] l=~ r=~]] +:: Source +++ to-map + |* a=(list) + (malt a) +:: +to-set: (list) -> +:: +:: Produces a set from a list. +:: Examples +:: > (to-map (limo ~[['aa' 1] ['bb' 2] ['cc' 3] ['dd' 4]])) +:: [n=['dd' 4] l=[n=['cc' 3] l=[n=['aa' 1] ~ ~] ~] r=[n=['bb' 2] ~ ~]] +:: Source +++ to-set + |* a=(list) + (silt a) +:: +transpose: (list (list T)) -> ?([~ ~] (list (list T))) +:: +:: Returns the transpose of the given sequence of lists. +:: Returns [~ ~] when all lists of list are ~. +:: Examples +:: > %- transpose +:: %: limo +:: (limo ~["a" "b" "c"]) +:: (limo ~["aa" "bb" "cc"]) +:: (limo ~["aaa" "bbb" "ccc"]) +:: ~ +:: == +:: ~[~["a" "aa" "aaa"] ~["b" "bb" "bbb"] ~["c" "cc" "ccc"]] +:: Crash +:: 'lists of unequal length' +:: Source +++ transpose + |* a=(list (list)) + =/ aa a + =/ equal=? %.y + ~| 'lists of unequal length' + |- ^- (list (list _?>(?=(^ ^ a) -.-.a))) + ?: =(%.n equal) !! + ?~ aa (transpose-jgd a) + ?~ t.aa (transpose-jgd a) + ?: =((lent i.aa) (lent i.t.aa)) $(aa t.aa) $(equal %.n) +:: +transpose-jgd: (list (list T)) -> ?([~ ~] (list (list T))) +:: +:: Returns the jagged transpose of the given sequence of lists. +:: Returns [~ ~] when all lists of list are ~. +:: Examples +:: > %- transpose-jgd +:: %: limo +:: (limo ~["a" "b" "c"]) +:: (limo ~["aa" "cc"]) +:: (limo ~["aaa" "bbb" "ccc"]) +:: ~ +:: == +:: ~[~["a" "aa" "aaa"] ~["b" "cc" "bbb"] ~["c" "ccc"]] +:: Source +++ transpose-jgd + |* a=(list (list)) + =/ aa=(list (list _?>(?=(^ ^ a) -.-.a))) a + =/ b=(list (list _?>(?=(^ ^ a) -.-.a))) ~ + =/ bb=(list _?>(?=(^ ^ a) -.-.a)) ~ + |- ^- (list (list _?>(?=(^ ^ a) -.-.a))) + ?~ a (flop b) + =/ c=(list (list _?>(?=(^ ^ a) -.-.a))) ~ + |- + ?~ aa + %= ^$ + a (flop c) + aa (flop c) + b [(flop bb) b] + bb ~ + == + ?~ -.aa $(aa t.aa) + ?~ ->.aa $(aa t.aa, bb [-<.aa bb]) + $(aa t.aa, bb [-<.aa bb], c [->.aa c]) +:: +try-exactly-one: (list T) -> (unit T) +:: +:: Returns the only element of the list or None if it is empty or contains more +:: than one element. +:: Examples +:: > (try-exactly-one (limo ~["tape"])) +:: [~ i=[i=t' t="ape"]] +:: Source +++ try-exactly-one + |* a=(list) + ?: =(1 (lent a)) `-.a + ~ +:: +try-find: [(list T) predicate:$-(T ?)] -> (unit T) +:: +:: Returns the first element for which the given function returns True. +:: Return None if no such element exists. +:: Examples +:: > (try-find (gulf [1 30]) |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5))))) +:: `15 +:: Source +++ try-find + |* [a=(list) b=$-(* ?)] + |- ^- (unit _?>(?=(^ a) i.a)) + ?~ a ~ + ?: (b i.a) `i.a $(a t.a) +:: +try-find-back: [(list T) predicate:$-(T ?)] -> (unit T) +:: +:: Returns the last element for which the given function returns True. +:: Return None if no such element exists. +:: Examples +:: > %: try-find-back +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: `30 +:: Source +++ try-find-back + |* [a=(list) b=$-(* ?)] + ?~ a ~ + (try-find (flop a) b) +:: +try-find-by-unit: [(list T) chooser:$-(T (unit T))] -> (unit T) +:: +:: Applies the given function to successive elements, returning Some(x) for the +:: first result where function returns Some(x). +:: If no such element exists then return None. +:: Examples +:: > (search-by-unit (limo ~[1 2 3 4]) |=(a=@ ?:(=((mod a 2) 0) `a ~))) +:: `2 +:: Crash +:: 'not found' +:: Source +++ try-find-by-unit + |* [hstk=(list) nedl=$-(* (unit *))] + |- ^- (unit _?>(?=(^ hstk) i.hstk)) + ?~ hstk ~ + =/ x (nedl i.hstk) + ?~ x $(hstk t.hstk) x +:: +try-find-index: [(list T) predicate:$-(T ?)] -> (unit @) +:: +:: Returns the index of the first element in the list that satisfies the given +:: predicate. Return None if no such element exists. +:: Examples +:: > %: try-find-index +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: `14 +:: Source +++ try-find-index + |* [a=(list) b=$-(* ?)] + =/ i 0 + |- ^- (unit @) + ?~ a ~ + ?: (b i.a) `i $(a t.a, i +(i)) +:: +try-find-index-back: [(list T) predicate:$-(T ?)] -> (unit @) +:: +:: Returns the index of the last element in the list that satisfies the given +:: predicate. Return None if no such element exists. +:: Examples +:: > %: try-find-index-back +:: (gulf [1 30]) +:: |=(a=@ud ?&(=(0 (mod a 3)) =(0 (mod a 5)))) +:: == +:: `29 +:: Source +++ try-find-index-back + |* [a=(list) c=$-(* ?)] + ?~ a ~ + =/ b (flop a) + =/ i (dec (lent a)) + |- ^- (unit @ud) + ?~ b ~ + ?: (c i.b) `i + ?: =(0 i) ~ + $(b t.b, i (dec i)) +:: +try-head: (list T) -> (unit T) +:: +:: Returns the first element of the list, or None if the list is empty. +:: Examples +:: > (try-head ~[1 2]) +:: `1 +:: Source +++ try-head + |* a=(list) + ?~ a ~ + `i.a +:: +try-item: [(list T) index:@] -> (unit T) +:: +:: Tries to find the nth element in the list. Returns None if index is negative +:: or the list does not contain enough elements. +:: Examples +:: > (try-item `(list @)`~["aa" "bb" "cc" "dd"] 2) +:: [~ "cc"] +:: > (try-item `(list tape)`~["aa" "bb"] 2) +:: ~ +:: Source +++ try-item + |* [a=(list) i=@] + ?: (gte i (lent a)) ~ + `(snag i a) +:: +try-remove-at: [(list T) index:@] -> (unit (list T)) +:: +:: Attempt a new list with the item at a given index removed returning +:: Some((list T)) upon success. +:: Examples +:: > (try-remove-at "good day, urbit!" 8) +:: [~ "good day urbit!"] +:: > (try-remove-at `(list @)`[1 2 3 4 ~] 2) +:: [~ ~[1 2 4]] +:: Source +++ try-remove-at + |* [a=(list) i=@] + ?: (gte i (lent a)) ~ + `(oust [i 1] a) +:: +try-remove-many-at: [(list T) index=@ count=@] -> (list T) +:: +:: Return a new list with the number of items starting at a given index removed +:: returning Some((list T)) upon success. +:: Examples +:: > (try-remove-many-at "good day, urbit!" [4 5]) +:: [~ "good urbit!"] +:: > (try-remove-many-at `(list @)`[1 2 3 4 ~] [2 2]) +:: [~ ~[1 2]] +:: Source +++ try-remove-many-at + |* [a=(list) i=@ c=@] + ?: (gth (add i c) (lent a)) ~ + `(oust [i c] a) +:: +try-tail: (list T) -> (unit (list T)) +:: +:: Returns the elements of the list after the first. +:: Examples +:: > (try-tail ~[1 2]) +:: `~[2] +:: Source +++ try-tail + |* a=(list) + ?~ a ~ + `t.a +:: +try-tail-end: (list T) -> (unit T) +:: +:: Returns the last element of the list. Return None if no such element exists. +:: Examples +:: > (try-tail-end ~[1 2 3]) +:: `3 +:: Source +++ try-tail-end + |* a=(list) + ?~ a ~ + `(rear a) +:: +try-update-at: [(list T) index:@ value:T] -> (list T) +:: +:: Return a new list with the item at a given index set to the new value. +:: Examples +:: > (try-update-at (limo ~[2 3 4]) 1 11) +:: [~ ~[2 11 4]] +:: > (try-update-at (limo ~[2 3 4]) 3 11) +:: ~ +:: Crash +:: 'not found' +:: Source +++ try-update-at + |* [a=(list) b=@ c=*] + ?: (gte b (lent a)) ~ + `(snap a b c) +:: +unfold: [state:T1 generator:$-(T1 -> (unit [T1 T2]))] -> (list T2) +:: +:: Returns a list that contains the elements generated by the given computation +:: The generator is repeatedly called to build the list until it returns None. +:: The given initial state argument is passed to the element generator. +:: Examples +:: > (unfold 1 |=(a=@ ?:((gth a 100) ~ `[(mul a 2) a]))) +:: ~[1 2 4 8 16 32 64] +:: Source +++ unfold + |* [state=* gen=$-(* (unit [* *]))] + =/ res=(list) ~ + |- + =/ x (gen state) + ?~ x (flop res) + =/ y (need x) + $(state -.y, res [+.y res]) +:: +unzip: (list [T1 T2]) - [(list T1) (list T2)] +:: +:: Splits a list of pairs into two lists. +:: Examples +:: > (unzip (limo ~[[1 "aa"] [2 "bb"]])) +:: [~[1 2] ~["aa" "bb"]] +:: Source +++ unzip + |* a=(list [* *]) + =/ b=(list *) ~ + =/ c=(list *) ~ + |- + ?~ a [(flop b) (flop c)] + $(a t.a, b [-.i.a b], c [+.i.a c]) +:: +unzip3: (list [T1 T2 T3]) - [(list T1) (list T2) (list T3)] +:: +:: Splits a list of triples into three lists. +:: Examples +:: > (unzip3 (limo ~[[1 "aa" 'a'] [2 "bb" 'b']])) +:: [~[1 2] ~["aa" "bb"] ~['a' 'b']] +:: Source +++ unzip3 + |* a=(list [* *]) + =/ b=(list *) ~ + =/ c=(list *) ~ + =/ d=(list *) ~ + |- + ?~ a [(flop b) (flop c) (flop d)] + $(a t.a, b [-.i.a b], c [+<.i.a c], d [+>.i.a d]) +:: +update-at: [(list T) index:@ value:T] -> (list T) +:: +:: Return a new list with the item at a given index set to the new value. +:: Examples +:: > (update-at (limo ~[2 3 4]) 1 11) +:: ~[2 11 4] +:: Crash +:: 'not found' +:: Source +++ update-at + |* [a=(list) b=@ c=*] + ?: (gte b (lent a)) ~|('not found' !!) + (snap a b c) +:: +windowed: [(list T) window-size:@] -> (list (list T)) +:: +:: Returns a list of sliding windows containing elements drawn from the input +:: list. Each window is returned as a fresh list. +:: Examples +:: > (windowed (limo ~[1 2 3 4 5]) 3) +:: ~[~[1 2 3] ~[2 3 4] ~[3 4 5]] +:: Crash +:: 'empty list' +:: 'window length is 0' +:: 'list shorter than window' +:: Source +++ windowed + |* [p=(list *) q=@] + ?~ q ~|('window length is 0' !!) + =/ b=(list (list _?>(?=(^ p) i.p))) ~ + =/ sub-tree=(list _?>(?=(^ p) i.p)) ~ + =/ pp=(list _?>(?=(^ p) i.p)) p + |- ^- (list (list _?>(?=(^ p) i.p))) + ?~ p ~|('empty list' !!) + ?~ pp ?: (lth (lent sub-tree) q) + ?~ b ~|('list shorter than window' !!) (flop b) + $(pp t.p, b [(flop sub-tree) b], sub-tree ~) + ?: =((lent sub-tree) q) + $(p t.p, pp t.p, b [(flop sub-tree) b], sub-tree ~) + $(pp t.pp, sub-tree [i.pp sub-tree]) +:: +zip: [(list T1) (list T2)] -> (list [T1 T2]) +:: +:: Combines the two lists into a list of pairs. The two lists must have equal +:: lengths. +:: Examples +:: > (zip `(list @)`~[1 2] `(list @)`~["aa" "bb"]) +:: ~[[1 "aa"] [2 "bb"]] +:: Crash +:: 'lists of unequal length' +:: Source +++ zip + |* [a=(list) b=(list)] + =/ c=(list [_?>(?=(^ a) i.a) _?>(?=(^ b) i.b)]) ~ + |- ^- (list [_?>(?=(^ a) i.a) _?>(?=(^ b) i.b)]) + ?~ a ?~ b (flop c) ~|('lists of unequal length' !!) + ?~ b ~|('lists of unequal length' !!) + $(a t.a, b t.b, c [[i.a i.b] c]) +:: +zip3: [(list T1) (list T2) (list T3)] -> (list [T1 T2 T3]) +:: +:: Combines the three lists into a list of triples. The lists must have equal +:: lengths. +:: Examples +:: > %: zip3 +:: `(list @)`~[1 2] +:: `(list tape)`~["aa" "bb"] +:: `(list @t)`~['a' 'b'] +:: == +:: ~[[1 "aa" 'a'] [2 "bb" 'b']] +:: Crash +:: 'lists of unequal length' +:: Source +++ zip3 + |* [a=(list) b=(list) c=(list)] + =/ d=(list [_?>(?=(^ a) i.a) _?>(?=(^ b) i.b) _?>(?=(^ c) i.c)]) ~ + |- ^- (list [_?>(?=(^ a) i.a) _?>(?=(^ b) i.b) _?>(?=(^ c) i.c)]) + ?~ a ?~ b ?~ c (flop d) + ~|('lists of unequal length' !!) + ~|('lists of unequal length' !!) + ?~ b ~|('lists of unequal length' !!) + ?~ c ~|('lists of unequal length' !!) + $(a t.a, b t.b, c t.c, d [[i.a i.b i.c] d]) +--
\ No newline at end of file diff --git a/desk/lib/server.hoon b/desk/lib/server.hoon new file mode 100644 index 0000000..3ae3a0f --- /dev/null +++ b/desk/lib/server.hoon @@ -0,0 +1,174 @@ +=, eyre +|% ++$ request-line + $: [ext=(unit @ta) site=(list @t)] + args=(list [key=@t value=@t]) + == +:: +parse-request-line: take a cord and parse out a url +:: +++ parse-request-line + |= url=@t + ^- request-line + (fall (rush url ;~(plug apat:de-purl:html yque:de-purl:html)) [[~ ~] ~]) +:: +++ manx-to-octs + |= man=manx + ^- octs + (as-octt:mimes:html (en-xml:html man)) +:: +++ json-to-octs + |= jon=json + ^- octs + (as-octs:mimes:html (en:json:html jon)) +:: +++ app + |% + :: + :: +require-authorization: + :: redirect to the login page when unauthenticated + :: otherwise call handler on inbound request + :: + ++ require-authorization + |= $: =inbound-request:eyre + handler=$-(inbound-request:eyre simple-payload:http) + == + ^- simple-payload:http + :: + ?: authenticated.inbound-request + ~! this + ~! +:*handler + (handler inbound-request) + :: + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request.inbound-request + :: + :: +require-authorization-simple: + :: redirect to the login page when unauthenticated + :: otherwise pass through simple-paylod + :: + ++ require-authorization-simple + |= [=inbound-request:eyre =simple-payload:http] + ^- simple-payload:http + :: + ?: authenticated.inbound-request + ~! this + simple-payload + :: + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request.inbound-request + :: + ++ give-simple-payload + |= [eyre-id=@ta =simple-payload:http] + ^- (list card:agent:gall) + =/ header-cage + [%http-response-header !>(response-header.simple-payload)] + =/ data-cage + [%http-response-data !>(data.simple-payload)] + :~ [%give %fact ~[/http-response/[eyre-id]] header-cage] + [%give %fact ~[/http-response/[eyre-id]] data-cage] + [%give %kick ~[/http-response/[eyre-id]] ~] + == + -- +++ core + |% + ++ gate + =| opt=@ + |= a=@ opt + :: ++ try gate(opt 5) + ++ try2 + =/ g gate + g(opt 5) + -- +++ gen + |% + :: + ++ max-1-da ['cache-control' 'max-age=86400'] + :: ++ max-1-wk ['cache-control' 'max-age=604800'] + ++ max-1-wk ['cache-control' 'no-cache, no-store, must-revalidate'] + ++ no-cache ['cache-control' 'no-cache, no-store, must-revalidate'] + :: + ++ lol + =| lmao=? + |= a=* %lol + ++ html-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/html'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ css-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/css'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ js-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/javascript'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ png-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'image/png'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ svg-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ ico-response + |= =octs + ^- simple-payload:http + [[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs] + :: + ++ woff2-response + =| cache=? + |= =octs + ^- simple-payload:http + [[200 [['content-type' 'font/woff2'] max-1-wk ~]] `octs] + :: + ++ json-response + =| cache=_| + |= =json + ^- simple-payload:http + :_ `(json-to-octs json) + [200 [['content-type' 'application/json'] ?:(cache [max-1-da ~] ~)]] + :: + ++ manx-response + =| cache=_| + |= man=manx + ^- simple-payload:http + :_ `(manx-to-octs man) + [200 [['content-type' 'text/html'] ?:(cache [max-1-da ~] ~)]] + :: + ++ not-found + ^- simple-payload:http + [[404 ~] ~] + :: + ++ login-redirect + |= =request:http + ^- simple-payload:http + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request + :: + ++ redirect + |= redirect=cord + ^- simple-payload:http + [[307 ['location' redirect]~] ~] + -- +-- diff --git a/desk/lib/sigil/sigil.hoon b/desk/lib/sigil/sigil.hoon new file mode 100644 index 0000000..bde3889 --- /dev/null +++ b/desk/lib/sigil/sigil.hoon @@ -0,0 +1,227 @@ +:: sigil: @p svg generation +:: +:: usage: do a named import, then invoke as a function: +:: (sigil ~zod) +:: +:: optionally modify configuration parameters: +:: %. ~paldev +:: %_ sigil +:: size 25 +:: fg "black" +:: bg "#2aa779" +:: margin | +:: icon & +:: == +:: +::NOTE svg construction logic is coupled to the symbols definitions. +:: the symbols' elements assume they live in a space of 128x128. +:: what we do here is assume an svg _canvas_ of 128x128, draw the +:: symbols at their original sizes, and then scale them down to fit. +:: +/+ sigil-symbols +:: +:: config +:: +=/ fg=tape "white" +=/ bg=tape "black" +=/ size=@ud 128 +=/ margin=? & +=/ icon=? | +:: +:: +~% %sigil ..part ~ +=/ who=ship ~zod +=/ syc=@ud 1 +|^ |= =ship + ^- manx + :: + =. who ship + =/ syz (simp who) + =. syc (lent syz) + :: shift the sigil to account for the margin + :: scale the sigil to account for the amount of symbols + :: + =/ sire=@rd (sun:rd size) + =/ tr=tape + ::TODO render transform inside +sigil:svg? + %+ transform:svg + ?. margin ~ + =+ grid:pos + `[(gird:pos x) (gird:pos y)] + `span:pos + :: + =/ sw=@rd ::TODO + ?: icon .~0.8 ::TODO scale with size? + (add:rd .~0.33 (div:rd sire .~128)) + :: + %- outer:svg + %+ sigil:svg + [tr sw] + (symbols:svg syz) +:: +++ pos + |% + ++ span :: symbol scale (relative to full canvas) + ^- @rd + ::TODO accounting for margin here feels a bit ugly? + ?+ (max grid) !! + %1 ?:(margin .~0.4 .~1) + %2 ?:(margin .~0.4 .~0.5) + %4 ?:(margin .~0.2 .~0.25) + == + :: + ++ grid :: size in symbols + ^- [x=@ud y=@ud] + ?+ syc !! + %16 [4 4] + %8 [4 4] + %4 [2 2] + %2 [2 1] + %1 [1 1] + == + :: + ++ gird :: calculate margin + |= n=@ud + ^- @rd + =- (div:rd - .~2) :: / both sides + %+ sub:rd .~128 :: canvas size - + %+ mul:rd (sun:rd n) :: symbols * + %+ mul:rd span:pos :: symbol scale * + .~128 :: symbol size + :: + ++ plan :: as position on symbol grid + |= i=@ud + ^- [x=@ud y=@ud] + ?+ [syc i] !! + [%16 *] [(mod i 4) (div i 4)] + :: + [%8 %0] [0 0] + [%8 %1] [3 0] + [%8 %2] [0 3] + [%8 %3] [3 3] + [%8 %4] [1 1] + [%8 %5] [2 1] + [%8 %6] [1 2] + [%8 %7] [2 2] + :: + [%4 *] [(mod i 2) (div i 2)] + [%2 *] [i 0] + [%1 *] [0 0] + == + -- +:: +++ svg + |% + ++ outer + |= inner=manx + ^- manx + =/ s=tape ((d-co:co 1) size) + ;svg + =style "display: block; width: {s}px; height: {s}px;" :: prevent bottom margin on svg tag + =width s + =height s + =viewBox "0 0 128 128" + =version "1.1" + =xmlns "http://www.w3.org/2000/svg" + ::TODO additional attributes from config arg? + ;rect + =fill bg + =width "128" + =height "128"; + ;+ inner + == + :: + ::TODO should it be possible to get these svg elements out of this lib? + ++ sigil + |= [[tr=tape sw=@rd] symbols=(list manx)] + ^- manx + ;g + =transform tr + =stroke-width (say-rd sw) + =stroke-linecap "square" + =fill fg + =stroke bg + ::NOTE unfortunately, vector-effect cannot be inherited, + :: so it gets inlined in the symbol elements instead + :: =vector-effect "non-scaling-stroke" + ;* symbols + == + :: + ++ symbols + |= noms=(list @t) + ^- (list manx) + =| i=@ud + =/ l=@ud (lent noms) + |- + ?~ noms ~ + :_ $(noms t.noms, i +(i)) + ::TODO exclude if both 0 + =+ (plan:pos i) + ;g(transform (transform `[(sun:rd (mul x 128)) (sun:rd (mul y 128))] ~)) + ;* =+ ((symbol i.noms) fg bg) + ?.(icon - (scag 1 -)) + == + :: + ++ symbol ~(got by sigil-symbols) + :: + ++ transform ::TODO take manx instead so we can omit attr entirely? + |= [translate=(unit [x=@rd y=@rd]) scale=(unit @rd)] + ^- tape + %- zing + ^- (list tape) + ::TODO make cleaner + =- ?: ?=(?(~ [* ~]) -) - + (join " " `(list tape)`-) + ^- (list tape) + :~ ?~ translate ~ + ?: =([0 0] u.translate) ~ + "translate({(say-rd x.u.translate)} {(say-rd y.u.translate)})" + :: + ?~ scale ~ + "scale({(say-rd u.scale)})" + == + -- +:: +++ simp + |= =ship + ^- (list @t) + :: split into phonemes + :: + =/ noms=(list @t) + =/ nom=@t + (rsh 3 (scot %p ship)) + |- ?~ nom ~ + |- ?: =('-' (end 3 nom)) + $(nom (rsh 3 nom)) + :- (end 3^3 nom) + ^$(nom (rsh 3^3 nom)) + :: fill leading empties with 'zod' + :: + =/ left=@ud + =- (sub - (lent noms)) + %- bex + ?- (clan:title ship) + %czar 0 + %king 1 + %duke 2 + %earl 3 + %pawn 4 + == + |- + ?: =(0 left) noms + $(noms ['zod' noms], left (dec left)) +:: +++ rd ~(. ^rd %n) +++ say-rd + |= n=@rd + ^- tape + =/ =dn (drg:rd n) + ?> ?=(%d -.dn) + =/ [s=? m=@ud] (old:si e.dn) + =/ x=@ud (pow 10 m) + %+ weld + %- (d-co:co 1) + ?:(s (mul a.dn x) (div a.dn x)) + ?: s ~ + ['.' ((d-co:co m) (mod a.dn x))] +-- diff --git a/desk/lib/sigil/symbols.hoon b/desk/lib/sigil/symbols.hoon new file mode 100644 index 0000000..1131612 --- /dev/null +++ b/desk/lib/sigil/symbols.hoon @@ -0,0 +1,14332 @@ +:: sigil-symbols: svg symbols for phonemes, for use in /lib/sigil +:: +:: the map is keyed by phoneme cords and contains functions for +:: generating lists of manxes based on fore- and background colors, +:: intended to be wrapped up in an svg <g> for further processing. +:: +:: shapes and default attributes sourced from: +:: https://github.com/urbit/sigil-js/blob/fdea06f/src/index.json +:: +::NOTE to reduce svg size, we exclude certain common/shared attributes. +:: we expect the /lib/sigil to wrap these elements in a <g> which sets +:: those attributes, letting them be inherited. they are as follows: +:: =fill fg +:: =stroke bg +:: =stroke-linecap "square" +:: =stroke-width +:: we assume the defaults specified above, and only include those +:: attributes below if they deviate from those. (this includes adding +:: stroke="none" for elements whose original specification did not +:: include a stroke.) +:: unfortunately, the vector-effect attribute cannot be inherted by <g> +:: children, so we have to inline it for every element here. +:: for ease of change, we leave excluded attributes as comments here. +:: +^~ +%- ~(gas by *(map cord $-([fg=tape bg=tape] (list manx)))) +:~ + :- 'bac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'bal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "32.0072" + =x2 "32.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "64.0072" + =x2 "64.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "96.0072" + =x2 "96.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'ban' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 70.6924 70.6924 128 -1.52588e-05 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 35.3462 99.3462 64 64 64C28.6538 64 0 35.3462 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'bel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ben' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ber' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'bet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'bic' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0C32 70.6925 74.9807 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'bin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'bis' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bur' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'bus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'byl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'byn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'byr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'byt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'dac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L-5.96046e-08 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "63.29" + =y2 "63.2929" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "32.0072" + =x2 "32.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "64.0072" + =x2 "64.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "96.0072" + =x2 "96.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'dan' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'das' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'dat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 -1.54503e-06 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dav' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'deb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "112" + =cy "16" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "112" + =cy "16" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'def' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 94L94 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 64L64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 32L32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'deg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'del' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'den' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'dep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'der' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128L96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'des' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'det' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.996" + =x2 "47.9964" + =y2 "79.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96.5" + =y1 "3.07317e-08" + =x2 "96.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32.5" + =y1 "3.07317e-08" + =x2 "32.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'dib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "5.25874e-08" + =y1 "32" + =x2 "128" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dif' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "16" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "16" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'dig' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'din' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.0029152 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'div' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-4.19629e-06 96C70.6924 96 128 53.0193 128 5.59506e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-2.79753e-06 64C70.6924 64 128 35.3462 128 5.59506e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'doc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M127.997 0L-0.00291443 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726C28.8758 53.8694 28.8758 74.1306 41.3726 86.6274" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-4.19629e-06 16C26.5097 16 48 37.4903 48 64C48 90.5097 26.5097 112 0 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'don' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-3.8147e-06 128C-7.24632e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "63.5" + =x2 "128" + =y2 "63.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8693 86.6274 41.3725C74.1306 28.8758 53.8694 28.8758 41.3726 41.3725" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'doz' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128L0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M30.0589 30.0589C48.804 11.3137 79.196 11.3137 97.9411 30.0589C116.686 48.804 116.686 79.196 97.9411 97.9411" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M52.6863 52.6863C58.9347 46.4379 69.0653 46.4379 75.3137 52.6863C81.5621 58.9347 81.5621 69.0653 75.3137 75.3137" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M41.3726 41.3726C53.8694 28.8758 74.1306 28.8758 86.6274 41.3726C99.1242 53.8694 99.1242 74.1306 86.6274 86.6274" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'duc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 64L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dun' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dur' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'dus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'dut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dux' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-3.8147e-06 1.11901e-05C-7.24633e-07 35.3462 28.6538 64 64 64C99.3462 64 128 35.3462 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'fad' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fan' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'feb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fed' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fer' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'fid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00291443 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fig' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "98" + =y1 "2.18557e-08" + =x2 "98" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fip' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'fog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'for' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fos' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 0C96 53.0193 53.0193 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 35.3462 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0C32 17.6731 17.6731 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ful' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fun' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fur' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M86.8823 41.6275C74.3855 29.1307 54.1242 29.1307 41.6274 41.6275C29.1307 54.1243 29.1307 74.3855 41.6274 86.8823" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'hac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'had' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'han' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'hap' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'har' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'has' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "16" + =r "8" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M48 32C48 40.8366 40.8366 48 32 48C23.1634 48 16 40.8366 16 32C16 23.1634 23.1634 16 32 16C40.8366 16 48 23.1634 48 32ZM32 40C36.4183 40 40 36.4183 40 32C40 27.5817 36.4183 24 32 24C27.5817 24 24 27.5817 24 32C24 36.4183 27.5817 40 32 40Z" + =fill bg; + == +:: + :- 'hav' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'heb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.00285417" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'hes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M48 96C48 104.837 40.8366 112 32 112C23.1634 112 16 104.837 16 96C16 87.1634 23.1634 80 32 80C40.8366 80 48 87.1634 48 96ZM32 104C36.4183 104 40 100.418 40 96C40 91.5817 36.4183 88 32 88C27.5817 88 24 91.5817 24 96C24 100.418 27.5817 104 32 104Z" + =fill bg; + == +:: + :- 'het' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128L96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'hid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M48 64C48 72.8366 40.8366 80 32 80C23.1634 80 16 72.8366 16 64C16 55.1634 23.1634 48 32 48C40.8366 48 48 55.1634 48 64ZM32 72C36.4183 72 40 68.4183 40 64C40 59.5817 36.4183 56 32 56C27.5817 56 24 59.5817 24 64C24 68.4183 27.5817 72 32 72Z" + =fill bg; + == +:: + :- 'hob' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hoc' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "48" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "47" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "47" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "81" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "81" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "48" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lab' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 -9.40976e-06C64 70.6924 92.6538 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 -7.63193e-07C32 70.6924 74.9807 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lad' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "95.35" + =y1 "32.7071" + =x2 "32.0571" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lan' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "112" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "112" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "2.78181e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'las' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lav' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'leb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-1.64036e-05 32C53.0193 32 96 74.9807 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'led' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'leg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.63192e-07 32C17.6731 32 32 46.3269 32 64C32 81.6731 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'len' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ler' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'let' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9965" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'lib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'lig' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "128" + =x2 "64" + =y2 "-6.55671e-08" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "80" + =cy "64" + =r "8" + =fill bg + =stroke "none"; + == +:: + :- 'lis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-4.70488e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00286865 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'liv' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-5.21346e-06 32C70.6924 32 128 17.6731 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M3.4331e-06 96C70.6924 96 128 53.0193 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'loc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lom' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'los' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'luc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'lun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lur' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lux' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'lyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "80" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'mag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'map' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.0029152 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 64L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'mat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C110.327 32 96 17.6731 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'meb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'med' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'meg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mer' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.996" + =x2 "47.9964" + =y2 "79.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'met' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128L32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'mic' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-2.09815e-06 80C26.5097 80 48 101.49 48 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mig' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-4.37114e-08" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "96" + =x2 "-4.37114e-08" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'min' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'mip' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9964" + =x2 "48.0036" + =y2 "47.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00286865 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'mit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'moc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 96L128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 90.5097 90.5097 112 64 112C37.4903 112 16 90.5097 16 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 0C112 26.5097 90.5097 48 64 48C37.4903 48 16 26.5097 16 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'mop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0035" + =y1 "15.9964" + =x2 "48.0035" + =y2 "47.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.996" + =x2 "47.9964" + =y2 "79.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "80" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mur' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'myl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "16" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "16" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'myn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 1.52638e-06C57.3076 -7.74381e-06 9.2702e-06 57.3075 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'myr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'nal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M2.82114e-06 110C60.7513 110 110 60.7513 110 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-5.09828e-06 73C40.3168 73 73 40.3168 73 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-6.63647e-07 37C20.4345 37 37 20.4345 37 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "112" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "112" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nap' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-1.52588e-05 128C-9.07866e-06 57.3075 57.3076 1.44926e-06 128 7.62939e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nav' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'neb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ned' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 1.90735e-06C96 53.0193 53.0193 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C57.3076 128 3.09007e-06 70.6925 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C74.9807 96 32 53.0193 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32C110.327 32 96 17.6731 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ner' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9965" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'net' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 64L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'nib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C92.6538 128 64 70.6925 64 7.63192e-07" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nim' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00285435 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'noc' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "1.51277e-05" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nom' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nub' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'num' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "31" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "31" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nux' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nym' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M95.9984 0C95.9984 26.3298 85.3985 50.1839 68.2332 67.5278M63.9983 0C63.9983 17.4933 56.9799 33.3473 45.6054 44.8999M31.9983 0C31.9983 8.65672 28.5609 16.5106 22.9766 22.2711" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 32C81.6731 32 96 46.3269 96 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'pac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pad' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pan' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M41.3726 86.6274C28.8758 74.1306 28.8758 53.8693 41.3726 41.3725C53.8694 28.8758 74.1306 28.8758 86.6274 41.3725" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'par' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 -2.67054e-06C32 53.0193 74.9807 96 128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 -1.78036e-06C64 35.3462 92.6538 64 128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 -8.9018e-07C96 17.6731 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ped' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'peg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'per' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.00285417" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'pet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'pic' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'pil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'poc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96.5" + =y1 "-0.5" + =x2 "96.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32.5" + =y1 "-0.5" + =x2 "32.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'pos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pub' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M80 64C80 55.1634 72.8366 48 64 48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pur' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M3.73284e-05 64C17.6633 64 33.6554 56.8445 45.2356 45.2741" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'put' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-5.59506e-06 128C35.3462 128 64 99.3462 64 64C64 28.6538 35.3462 1.54503e-06 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rab' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'rad' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ral' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ram' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'ran' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00291443 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "-1.29797e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rav' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'reb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 -9.40976e-06C57.3075 -6.31969e-06 -3.09007e-06 57.3075 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'red' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ref' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'reg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ren' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 74.9807 74.9807 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'res' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ret' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "53.9965" + =y2 "73.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'rex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'rib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ric' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rig' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ril' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rip' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ris' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'riv' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'roc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + ;circle + =cx "112" + =cy "16" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "112" + =cy "16" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'rol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ron' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 70.6924 70.6925 128 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ros' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ruc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'rum' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'run' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rux' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 64C32 81.6731 46.3269 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryg' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ryl' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rym' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C57.3075 128 -3.09007e-06 70.6925 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryp' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'rys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'ryx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'sal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'san' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "8" + =fill bg + =stroke "none"; + == +:: + :- 'sar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C128 57.3076 70.6925 0 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sav' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'seb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sed' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sef' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'seg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 110.327 46.3269 96 64 96C81.6731 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 128C96 110.327 81.6731 96 64 96C46.3269 96 32 110.327 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 128L64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128L32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 128L96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ser' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'set' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 64L128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 9.40976e-06C64 35.3462 92.6538 64 128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sic' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C110.327 128 96 113.673 96 96C96 78.3269 110.327 64 128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sig' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sim' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sip' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 64C16 37.4903 37.4903 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'siv' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'soc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "16" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "16" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'sog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L-5.96046e-08 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'som' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'son' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "127.553" + =y1 "128.224" + =x2 "63.5528" + =y2 "0.223598" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sub' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'sug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64C32 46.3269 46.3269 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sum' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =stroke "none"; + ;circle + =cx "80" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sur' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M3.73284e-05 64.0001C17.6633 64.0001 33.6554 56.8446 45.2356 45.2742" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'syd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C37.4903 16 16 37.4903 16 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'syl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sym' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96.5" + =y1 "3.07317e-08" + =x2 "96.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'syn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'syp' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'syr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'syt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'syx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128C4.63574e-06 92.6488 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'tac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tad' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tan' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M48 128C48 101.49 26.5097 80 0 80" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 128C16 119.163 8.83656 112 0 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C128 57.3075 70.6925 0 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tap' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'teb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'ted' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'teg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 80C119.163 80 112 72.8366 112 64C112 55.1634 119.163 48 128 48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "15" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "15" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M0 0L127.986 127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M32 0L128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 0L128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 0L128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.00285417" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'ten' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "48" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.14479e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ter' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96.5" + =y1 "3.07317e-08" + =x2 "96.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9965" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tic' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C110.327 32 96 17.6731 96 -1.39876e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M112 32C112 40.8366 104.837 48 96 48C87.1634 48 80 40.8366 80 32C80 23.1634 87.1634 16 96 16C104.837 16 112 23.1634 112 32ZM96 40C100.418 40 104 36.4183 104 32C104 27.5817 100.418 24 96 24C91.5817 24 88 27.5817 88 32C88 36.4183 91.5817 40 96 40Z" + =fill bg; + == +:: + :- 'til' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tim' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00291443 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tip' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tob' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'toc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 128C16 101.49 37.4903 80 64 80C90.5097 80 112 101.49 112 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tom' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ton' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'top' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tuc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tun' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tux' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tyc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 -2.28831e-06C57.3076 -3.13131e-06 8.42999e-07 57.3075 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'typ' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 1.90735e-06C96 53.0193 53.0193 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 0L128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 64C35.3462 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tyv' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M256 0L128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'wal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wan' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'wat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'web' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C128 57.3075 70.6925 0 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wed' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'weg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M79.5254 0C79.5254 8.83656 72.3619 16 63.5254 16C54.6888 16 47.5254 8.83656 47.5254 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'wep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wer' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "112" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "112" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 64H0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'wic' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "48.0035" + =y1 "80.0036" + =x2 "16.0035" + =y2 "112.004" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'win' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wis' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 64L128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wyc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'wyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M32 64C32 46.3269 46.3269 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-3.8147e-06 128C-7.24633e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'zod' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +==
\ No newline at end of file diff --git a/desk/lib/sortug.hoon b/desk/lib/sortug.hoon new file mode 100644 index 0000000..bf988da --- /dev/null +++ b/desk/lib/sortug.hoon @@ -0,0 +1,729 @@ +|% +++ maybe + |* =mold + $% [%ok mold] + [%err p=@t] + == +++ uri-encode + |= t=tape ^- tape + =+ (en-urlt:html t) :: double-encoding because iris decodes shit at some point for some reason +(en-urlt:html -) +++ web + |% + ++ images + %- silt :~('png' 'jpg' 'jpeg' 'svg' 'webp') + ++ is-image + |= url=@t ^- ? + =/ u=(unit purl:eyre) (de-purl:html url) + ?~ u .n + =/ ext p.q.u.u + ?~ ext .n + (~(has in images) u.ext) + -- +++ slice + |* [a=(list) count=@ud index=@ud] + =| i=@ud + |- ^+ a + ?~ a ~ + ?: .=(count 0) ~ + ?: (lth i index) $(a t.a, i +(i)) + :- i.a + $(a t.a, i +(i), count (dec count)) + +++ pick + |* [a=(list) b=@] + =/ top (dec (lent a)) + =/ ind (mod b top) + (snag ind a) +++ flop :: reverse + |* a=(list) + => .(a (homo a)) + ^+ a + =+ b=`_a`~ + |- + ?~ a b + $(a t.a, b [i.a b]) +++ seq +|% + :: TODO study these two well + ++ reel + ~/ %reel + |* [a=(list) b=_=>(~ |=([* *] +<+))] + |- ^+ ,.+<+.b + ?~ a + +<+.b + (b i.a $(a t.a)) + ++ roll + ~/ %roll + |* [a=(list) b=_=>(~ |=([* *] +<+))] + |- ^+ ,.+<+.b + ?~ a + +<+.b + $(a t.a, b b(+<+ (b i.a +<+.b))) + ++ snip + |* a=(list) + =/ rev (flop a) + ?~ rev a + (flop t.rev) +-- +++ fold +|* [a=(list) b=* c=_|=(^ +<+)] +|- ^+ b +?~ a b +=/ nb (c [i.a b]) +$(a t.a, b nb) +++ foldi +|* [a=(list) b=* c=_|=(^ +<+)] +=| i=@ud +|- ^+ b +?~ a b +=/ nb (c i i.a b) +$(a t.a, b nb, i +(i)) +++ mapi +|* [a=(list) b=gate] +=| i=@ud +=> .(a (homo a)) +^- (list _?>(?=(^ a) (b i i.a))) +|- +?~ a ~ +:- i=(b i i.a) +t=$(a t.a, i +(i)) +++ cord-size +|= c=@t +(met 3 c) +++ concat-cord-list +|= c=(list @t) +(rap 3 c) +++ cut-cord +|= [c=@t s=@ud e=@ud] +(cut 3 [s e] c) +++ cfind-index + |= [nedl=@t hay=@t length=@ud case=?] ^- (unit [snip=@t left-amari=@ud right-amari=@ud]) + =/ nlen (met 3 nedl) + =/ hlen (met 3 hay) + ?: (lth hlen nlen) ~ + =? nedl !case + (crass nedl) + :: iterate from index 0 + =/ pos 0 + =/ lim (sub hlen nlen) + |- + :: If our position is further than the length of query + :: it's obviously not gonna happen anymore so return + ?: (gth pos lim) ~ + :: If needle is equal to the [position needle-length] slice of hay then we're good + =/ substring ?: case (cut 3 [pos nlen] hay) (crass (cut 3 [pos nlen] hay)) + ?. .=(nedl substring) $(pos +(pos)) + :: we grab a bigger piece of the cord, starting where + =/ [start-index=@ud end-index=@ud] [pos (add pos nlen)] + :: say it's [150 160] + =/ halfway=@ud (div (sub length nlen) 2) :: that's 45 + =/ start=@ud ?: (gth pos halfway) (sub pos halfway) 0 :: that's 105 + =/ end=@ud ?: (gte (add halfway end-index) hlen) hlen (add halfway end-index) :: 200 + + =/ right-amari (sub halfway (sub end end-index)) :: 5 + =/ left-amari (sub halfway (sub start-index start)) :: 0 + =/ snip=@t (cut 3 [start end] hay) + %- some :+ snip left-amari right-amari + +++ cfindi + |= [nedl=@t hay=@t case=?] ^- @t + =/ nlen (met 3 nedl) + =/ hlen (met 3 hay) + =| res=@t + ?: (lth hlen nlen) res + =? nedl !case + (crass nedl) + :: iterate from index 0 + =/ pos 0 + =/ lim (sub hlen nlen) + |- + :: If our position is further than the length of query + :: it's obviously not gonna happen anymore so return + ?: (gth pos lim) res + :: If needle is equal to the [position needle-length] slice of hay then we're good + ?: .= nedl + ?: case + (cut 3 [pos nlen] hay) + (crass (cut 3 [pos nlen] hay)) + :: we grab a bigger piece of the cord, starting where + =/ s ?: (lte pos 50) 0 (sub pos 50) + (cut 3 [s 100] hay) + $(pos +(pos)) +++ cfind + |= [nedl=@t hay=@t case=?] + ^- ? + =/ nlen (met 3 nedl) + =/ hlen (met 3 hay) + ?: (lth hlen nlen) + | + =? nedl !case + (crass nedl) + =/ pos 0 + =/ lim (sub hlen nlen) + |- + ?: (gth pos lim) + | + ?: .= nedl + ?: case + (cut 3 [pos nlen] hay) + (crass (cut 3 [pos nlen] hay)) + & + $(pos +(pos)) + ++ crass + |= text=@t + ^- @t + %^ run + 3 + text + |= dat=@ + ^- @ + ?. &((gth dat 64) (lth dat 91)) + dat + (add dat 32) +++ js + |% + ++ de + |% + ++ maybe + |* fst=$-(json *) + |= jon=json + ?~ jon ~ (fst jon) + ++ st + |= mol=mold + |= jon=json + ?> ?=([%s *] jon) + %- mol p.jon + ++ ur + |* wit=$-(json *) + |= jon=(unit json) + ?~(jon ~ `(wit u.jon)) + ++ gen + |= jon=json + ?- -.jon + %s p.jon + %n p.jon + %b p.jon + %a (turn p.jon gen) + %o ((om:dejs:format gen) jon) + == + -- + ++ en + |% + ++ bitch %bitch + -- + -- +++ string + |% +++ replace + |= [bit=tape bot=tape =tape] + ^- ^tape + |- + =/ off (find bit tape) + ?~ off tape + =/ clr (oust [(need off) (lent bit)] tape) + $(tape :(weld (scag (need off) clr) bot (slag (need off) clr))) + :: +++ split + |= [str=tape delim=tape] + ^- (list tape) + (split-rule str (jest (crip delim))) +:: +:: Split string by parsing rule delimiter. +++ split-rule + |* [str=tape delim=rule] + ^- (list tape) + %+ fall + (rust str (more delim (star ;~(less delim next)))) + [str ~] +++ contains + |= [str=tape nedl=tape] + ^- ? + ?~ (find nedl str) | & + ++ trim + |= a=tape + |- ^- tape + ?: ?=([%' ' *] a) + $(a t.a) + (flop a) + ++ number + |= a=@ud ^- tape + ?: =(0 a) "0" + %- flop + |- ^- tape + ?:(=(0 a) ~ [(add '0' (mod a 10)) $(a (div a 10))]) + ++ capitalize + |= a=@t ^- tape + =/ t=(list @t) (trip a) + ?~ t (trip a) + t(i (sub i.t 32)) + ++ enpath + |= str=cord ^- path + =/ allow ;~(pose low nud) + =/ lcase %+ cook + |= a=@t (add 32 a) hig + =/ rul ;~(pose allow lcase) + =/ del ;~(less rul next) + =/ frul (more del (cook crip (star rul))) + (rash str frul) + ++ enkebab2 + |= str=cord ^- tape + =/ allow ;~(pose low nud hep) + =/ kebab (cold '-' next) + =/ lcase %+ cook + |= a=@t (add 32 a) hig + =/ rul ;~(pose allow lcase kebab) + (rash str (star rul)) + ++ enkebab3 + |= str=cord ^- tape + =/ allow ;~(pose low nud hep) + =/ kebab (cold '-' next) + =/ lcase %+ cook + |= a=@t (add 32 a) hig + =/ rul ;~(pose allow lcase unic kebab) + (rash str (star rul)) + ++ unic + %- cook :_ unicode + |= a=@ %- crip (scow:parsing %uw a) + ++ unicode (shim 128 100.000.000) + ++ enkebab + |= str=cord + ^- cord + ~| str + =- (fall - str) + %+ rush str + =/ name + %+ cook + |= part=tape + ^- tape + ?~ part part + :- (add i.part 32) + t.part + ;~(plug hig (star low)) + %+ cook + |=(a=(list tape) (crip (zing (join "-" a)))) + ;~(plug (star low) (star name)) + ++ cut-cord + |= [=cord chars=@ud] + %+ end 3^chars cord + ++ pad + |= [t=tape length=@ud] ^- tape + ?: .=(length (lent t)) t + $(t "0{t}") + ++ date-to-path + |= d=@da ^- path + =+ [[a y] m [d h mm s f]]=(yore d) + =/ yr (numb:enjs:format y) + ?> ?=(%n -.yr) + /[p.yr]/(scot %ud m)/(scot %ud d) + ++ date-to-tape + |= [d=@da delim=tape] ^- tape + =+ [[a y] m [d h mm s f]]=(yore d) + =/ ys (ud-to-cord y) + =/ month (pad "{<m.m>}" 2) + =/ day (pad "{<d.d>}" 2) + "{(trip ys)}{delim}{month}{delim}{day}" + ++ datetime-to-tape + |= [d=@da delim=tape] ^- tape + =+ [[a y] m [d h mm s f]]=(yore d) + =/ ys (ud-to-cord y) + =/ month (pad "{<m.m>}" 2) + =/ day (pad "{<d.d>}" 2) + =/ hours (pad "{<h.h>}" 2) + =/ minutes (pad "{<m.mm>}" 2) + =/ seconds (pad "{<s.s>}" 2) + "{(trip ys)}{delim}{month}{delim}{day} {hours}:{minutes}:{seconds}" + ++ time-to-tape + |= d=@da ^- tape + =+ [[a y] m [d h mm s f]]=(yore d) + =/ hours (pad "{<h.h>}" 2) + =/ minutes (pad "{<m.mm>}" 2) + "{hours}:{minutes}" + ++ ud-to-cord + |= n=@ud ^- @t + %- crip + %- zing (rush (scot %ud n) (more dot (star nud))) + ++ remove + |= [s=@t r=@t] ^- @t + %- crip + %- zing + %+ rush s + %+ more (jest r) + %- star + ;~(less (jest r) next) + -- +++ io + |_ =bowl:gall + ++ retrieve + |= =path + =/ bp /gx/(scot %p our.bowl)/[dap.bowl]/(scot %da now.bowl) + .^(* (weld bp (weld path /noun))) + ++ scry + |* [app=@tas =path =mold] + =/ bp /gx/(scot %p our.bowl)/[app]/(scot %da now.bowl) + =/ pat (weld bp (weld path /noun)) + .^(mold pat) + ++ scry2 + |* [app=@tas =path =mold] + =/ bp /gx/(scot %p our.bowl)/[app]/(scot %da now.bowl) + =/ pat (weld bp (weld path /noun)) + %- mole |. .^(mold pat) + ++ scry-pad + |= t=@tas ^- path /(scot %p our.bowl)/[t]/(scot %da now.bowl) + -- +++ sail + |% + ++ coki-to-string + |= m=(map @t @t) ^- cord + %- crip %- ~(rep by m) + |= [pair=[key=@t value=@t] acc=tape] + "{acc}{(trip key.pair)}={(trip value.pair)}; " + ++ handle-html-form + |= body=(unit octs) ^- (map @t @t) + ?~ body ~ + =/ text q.u.body + =/ clean (remove:string text '%0D') + :: TODO html forms use \0d\0a + :: for carriage return + :: this breaks the markdown parser + =/ parser (more tis (star next)) + =/ res (rush clean yquy:de-purl:html) + ?~ res ~ (malt u.res) + -- ++$ michi (list @t) :: proper path with upper case +++ parsing + |% + ++ to-htmldate |= d=@da ^- tape + =+ [[* y=@] m=@ [d=@ h=@ mm=@ s=@ f=*]]=(yore d) + =/ ys (scow %ud y) + =/ ms (pad:string (scow %ud m) 2) + =/ ds (pad:string (scow %ud d) 2) + =/ hs (pad:string (scow %ud h) 2) + =/ mins (pad:string (scow %ud mm) 2) + "{ys}-{ms}-{ds}T{hs}:{mins}" + ++ y (bass 10 (stun 3^4 dit)) + :: ++ m (sear (snug mon:yu) (plus alf)) + ++ d (bass 10 (stun 1^2 dit)) + :: :: ++t:stud:chrono: + ++ t :: hours:minutes:secs + :: %+ cook |=([h=@u @ m=@u @ s=@u] ~[h m s]) + :: ;~(plug d col d col d) + ;~(plug d col d) + ++ weekday-3 + ;~ pose + %+ cold 0 (jest 'Sun') + %+ cold 1 (jest 'Mon') + %+ cold 2 (jest 'Tue') + %+ cold 3 (jest 'Wed') + %+ cold 4 (jest 'Thu') + %+ cold 5 (jest 'Fri') + %+ cold 6 (jest 'Sat') + == + ++ monthname-3 + ;~ pose + %+ cold 1 (jest 'Jan') + %+ cold 2 (jest 'Feb') + %+ cold 3 (jest 'Mar') + %+ cold 4 (jest 'Apr') + %+ cold 5 (jest 'May') + %+ cold 6 (jest 'Jun') + %+ cold 7 (jest 'Jul') + %+ cold 8 (jest 'Aug') + %+ cold 9 (jest 'Sep') + %+ cold 10 (jest 'Oct') + %+ cold 11 (jest 'Nov') + %+ cold 12 (jest 'Dec') + == + ++ three-section-time :: hours:minutes:secs + %+ cook |=([h=@u @ m=@u @ s=@u] [h m s]) + ;~(plug d col d col d) + ++ html-datetime + %+ cook |= [y=@ud * m=@ud * d=@ud * h=@ud * min=@ud] + =/ dt *date =. dt dt(y y, m m, d.t d, h.t h, m.t min) + (year dt) + ;~ plug y hep d hep d (just 'T') + t + == + ++ twatter-date + %+ cook |= [w=@ * m=@ * d=@ * [h=@ mn=@ s=@] * y=@] + =| dat=date %- year + dat(y y, m m, t [d h mn s ~]) + ;~ plug + weekday-3 + ace + monthname-3 + ace + d + ace + three-section-time + ;~ plug + ace + lus + y + ace + == + y + == + ++ white (star gah) + ++ para + |% + ++ eof ;~(less next (easy ~)) + ++ white (mask "\09 ") + ++ blank ;~(plug (star white) (just '\0a')) + ++ hard-wrap (cold ' ' ;~(plug blank (star white))) + ++ one-space (cold ' ' (plus white)) + ++ empty + ;~ pose + ;~(plug blank (plus blank)) + ;~(plug (star white) eof) + ;~(plug blank (star white) eof) + == + ++ para + %+ ifix + [(star white) empty] + %- plus + ;~ less + empty + next + == + -- + ++ trim para:para :: from whom/lib/docu + ++ link auri:de-purl:html + ++ youtube + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'www.youtube.com/watch?v=') + (jest 'youtube.com/watch?v=') + (jest 'youtu.be/') + == + == + ;~ sfix + (star aln) + (star next) + == + == + ++ twatter + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'x.com/') + (jest 'twitter.com/') + == + (star ;~(less fas next)) + (jest '/status/') + == + ;~ sfix + (star nud) + (star next) + == + == + + :: WIP + ++ scow + |= [mod=@tas a=@] ^- tape + ?+ mod "" + %ud (a-co:co a) + %ux ((x-co:co 0) a) + %uv ((v-co:co 0) a) + %uw ((w-co:co 0) a) + == + ++ b64 (bass 64 (plus siw:ab)) + ++ b16 (bass 16 (plus six:ab)) + ++ slaw + |= [mod=@tas txt=@t] ^- (unit @) + ?+ mod ~ + %ud (rush txt dem) + %ux (rush txt b16) + %uv (rush txt vum:ag) + %uw (rush txt b64) + == + :: ++ b64 + :: %+ cook + :: |=(a=tape (rap 3 ^-((list @) a))) + :: (star ;~(pose nud low cen hig hep dot sig cab)) + ++ stam + %+ sear + |= m=michi + ^- (unit michi) + ?: ?=([~ ~] m) ~ + ?. =(~ (rear m)) `m + ~ + ;~(pfix fas (most fas b64)) + ++ smat + |= m=michi ^- tape + =/ t "/" + |- + ?~ m t + =/ nt "{t}/{(trip i.m)}" + $(m t.m, t nt) + ++ de-comma + %+ sear + |= p=path + ^- (unit path) + ?: ?=([~ ~] p) `~ + ?. =(~ (rear p)) `p + ~ + (most com urs:ab) + ++ de-path + :: modified from apat:de-purl:html + =/ delim ;~(pose fas dot) + %+ cook :: get rid of the last dot and make the extension a part of the path + |= p=path ?~ p p + =/ flopped=path (flop p) + =/ sr=path (rash -.flopped (csplit dot)) + =/ rest=path +.flopped + %- flop %+ welp (flop sr) rest + ;~(pfix fas (more fas smeg:de-purl:html)) + ++ atom-dots + |= s=@t ^- @ud + =/ no-dots (rush s dem) + ?~ no-dots (rash s dem:ag) u.no-dots + ++ csplit |* =rule + (more rule (cook crip (star ;~(less rule next)))) + ++ split |* =rule + (more rule (star ;~(less rule next))) + ++ dinfix |* [pf=rule sf=rule] + =/ neither (star ;~(less ;~(pose pf sf) next)) + ;~(pfix pf ;~(sfix neither sf)) + ++ infix + |* =rule + (ifix [rule rule] (star ;~(less rule next))) + + ++ infix2 + |* [delim=rule inner=rule] + |= tub=nail + =+ vex=(delim tub) + ?~ q.vex + (fail tub) + =/ but=nail tub + =+ outer=(;~(sfix (plus ;~(less delim next)) delim) q.u.q.vex) + ?~ q.outer + (fail tub) + =+ in=(inner [1 1] p.u.q.outer) + ?~ q.in + (fail tub) + outer(p.u.q p.u.q.in) + + ++ qux (bass 16 (stun [4 4] hit)) + ++ better-dejson :: parse JSON + =< |=(a=cord `(unit json)`(rush a apex)) + |% + :: :: ++abox:de-json:html + ++ abox :: array + %+ stag %a + (ifix [sel (wish ser)] (more (wish com) apex)) + :: :: ++apex:de-json:html + ++ apex :: any value + %+ knee *json |. ~+ + %+ ifix [spac spac] + ;~ pose + (cold ~ (jest 'null')) + (stag %b bool) + (stag %s stri) + (cook |=(s=tape [%n p=(rap 3 s)]) numb) + abox + obox + == + :: :: ++bool:de-json:html + ++ bool :: boolean + ;~ pose + (cold & (jest 'true')) + (cold | (jest 'false')) + == + :: :: ++digs:de-json:html + ++ digs :: digits + (star (shim '0' '9')) + :: :: ++esca:de-json:html + ++ esca :: escaped character + ;~ pfix bas + =* loo + =* lip + ^- (list (pair @t @)) + [b+8 t+9 n+10 f+12 r+13 ~] + =* wow `(map @t @)`(malt lip) + (sear ~(get by wow) low) + =* tuf ;~(pfix (just 'u') (cook tuft qux)) + ;~(pose doq fas soq bas loo tuf) + == + :: :: ++expo:de-json:html + ++ expo :: exponent + ;~ (comp twel) + (piec (mask "eE")) + (mayb (piec (mask "+-"))) + digs + == + :: :: ++frac:de-json:html + ++ frac :: fraction + ;~(plug dot digs) + :: :: ++jcha:de-json:html + ++ jcha :: string character + ;~(pose ;~(less doq bas prn) esca) + :: :: ++mayb:de-json:html + ++ mayb :: optional + |*(bus=rule ;~(pose bus (easy ~))) + :: :: ++numb:de-json:html + ++ numb :: number + ;~ (comp twel) + (mayb (piec hep)) + ;~ pose + (piec (just '0')) + ;~(plug (shim '1' '9') digs) + == + (mayb frac) + (mayb expo) + == + :: :: ++obje:de-json:html + ++ obje :: object list + %+ ifix [(wish kel) (wish ker)] + (more (wish com) pear) + :: :: ++obox:de-json:html + ++ obox :: object + (stag %o (cook malt obje)) + :: :: ++pear:de-json:html + ++ pear :: key-value + ;~(plug ;~(sfix (wish stri) (wish col)) apex) + :: :: ++piec:de-json:html + ++ piec :: listify + |* bus=rule + (cook |=(a=@ [a ~]) bus) + :: :: ++stri:de-json:html + ++ stri :: string + (cook crip (ifix [doq doq] (star jcha))) + :: :: ++tops:de-json:html + ++ tops :: strict value + ;~(pose abox obox) + :: :: ++spac:de-json:html + ++ spac :: whitespace + (star (mask [`@`9 `@`10 `@`13 ' ' ~])) + :: :: ++twel:de-json:html + ++ twel :: tape weld + |=([a=tape b=tape] (weld a b)) + :: :: ++wish:de-json:html + ++ wish :: with whitespace + |*(sef=rule ;~(pfix spac sef)) + -- ::de-json + -- :: parsing +++ search + |% + ++ parse-query + |= query=@t ^- (map @t [query=@t neg=?]) + :: =s \'"machine learning" OR "data science" lmao -filter:links -from:elonmusk since:2023-01-01 until:2023-10-12 lang:en filter:verified\' + ~ + ++ apex + %+ knee ** + |. ~+ + %- star + ;~ pose + (stag %quot quotes) + (stag %white (split:parsing ace)) + (stag %lol rest) + :: next + == +++ rest (plus ;~(less doq next)) +++ quotes (infix:parsing doq) +++ else (star next) + -- +-- diff --git a/desk/lib/strand.hoon b/desk/lib/strand.hoon new file mode 100644 index 0000000..b0db35b --- /dev/null +++ b/desk/lib/strand.hoon @@ -0,0 +1 @@ +rand diff --git a/desk/lib/strandio.hoon b/desk/lib/strandio.hoon new file mode 100644 index 0000000..c2f2137 --- /dev/null +++ b/desk/lib/strandio.hoon @@ -0,0 +1,812 @@ +/- spider +/+ libstrand=strand +=, strand=strand:libstrand +=, strand-fail=strand-fail:libstrand +|% +++ send-raw-cards + |= cards=(list =card:agent:gall) + =/ m (strand ,~) + ^- form:m + |= strand-input:strand + [cards %done ~] +:: +++ send-raw-card + |= =card:agent:gall + =/ m (strand ,~) + ^- form:m + (send-raw-cards card ~) +:: +++ ignore + |= tin=strand-input:strand + `[%fail %ignore ~] +:: +++ get-bowl + =/ m (strand ,bowl:strand) + ^- form:m + |= tin=strand-input:strand + `[%done bowl.tin] +:: +++ get-beak + =/ m (strand ,beak) + ^- form:m + |= tin=strand-input:strand + `[%done [our q.byk da+now]:bowl.tin] +:: +++ get-time + =/ m (strand ,@da) + ^- form:m + |= tin=strand-input:strand + `[%done now.bowl.tin] +:: +++ get-our + =/ m (strand ,ship) + ^- form:m + |= tin=strand-input:strand + `[%done our.bowl.tin] +:: +++ get-entropy + =/ m (strand ,@uvJ) + ^- form:m + |= tin=strand-input:strand + `[%done eny.bowl.tin] +:: +:: Convert skips to %ignore failures. +:: +:: This tells the main loop to try the next handler. +:: +++ handle + |* a=mold + =/ m (strand ,a) + |= =form:m + ^- form:m + |= tin=strand-input:strand + =/ res (form tin) + =? next.res ?=(%skip -.next.res) + [%fail %ignore ~] + res +:: +:: Wait for a poke with a particular mark +:: +++ take-poke + |= =mark + =/ m (strand ,vase) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ + `[%wait ~] + :: + [~ %poke @ *] + ?. =(mark p.cage.u.in.tin) + `[%skip ~] + `[%done q.cage.u.in.tin] + == +:: +++ take-sign-arvo + =/ m (strand ,[wire sign-arvo]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ + `[%wait ~] + :: + [~ %sign *] + `[%done [wire sign-arvo]:u.in.tin] + == +:: +:: Wait for a subscription update on a wire +:: +++ take-fact-prefix + |= =wire + =/ m (strand ,[path cage]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %fact *] + ?. =(watch+wire (scag +((lent wire)) wire.u.in.tin)) + `[%skip ~] + `[%done (slag (lent wire) wire.u.in.tin) cage.sign.u.in.tin] + == +:: +:: Wait for a subscription update on a wire +:: +++ take-fact + |= =wire + =/ m (strand ,cage) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %fact *] + ?. =(watch+wire wire.u.in.tin) + `[%skip ~] + `[%done cage.sign.u.in.tin] + == +:: +:: Wait for a subscription close +:: +++ take-kick + |= =wire + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %kick *] + ?. =(watch+wire wire.u.in.tin) + `[%skip ~] + `[%done ~] + == +:: +++ echo + =/ m (strand ,~) + ^- form:m + %- (main-loop ,~) + :~ |= ~ + ^- form:m + ;< =vase bind:m ((handle ,vase) (take-poke %echo)) + =/ message=tape !<(tape vase) + %- (slog leaf+"{message}..." ~) + ;< ~ bind:m (sleep ~s2) + %- (slog leaf+"{message}.." ~) + (pure:m ~) + :: + |= ~ + ^- form:m + ;< =vase bind:m ((handle ,vase) (take-poke %over)) + %- (slog leaf+"over..." ~) + (pure:m ~) + == +:: +++ take-watch + =/ m (strand ,path) + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %watch *] + `[%done path.u.in.tin] + == +:: +++ take-wake + |= until=(unit @da) + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign [%wait @ ~] %behn %wake *] + ?. |(?=(~ until) =(`u.until (slaw %da i.t.wire.u.in.tin))) + `[%skip ~] + ?~ error.sign-arvo.u.in.tin + `[%done ~] + `[%fail %timer-error u.error.sign-arvo.u.in.tin] + == +:: +++ take-tune + |= =wire + =/ m (strand ,[spar:ames (unit roar:ames)]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign * %ames %tune ^ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done +>.sign-arvo.u.in.tin] + == +:: +++ take-poke-ack + |= =wire + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %poke-ack *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + ?~ p.sign.u.in.tin + `[%done ~] + `[%fail %poke-fail u.p.sign.u.in.tin] + == +:: +++ take-watch-ack + |= =wire + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %watch-ack *] + ?. =(watch+wire wire.u.in.tin) + `[%skip ~] + ?~ p.sign.u.in.tin + `[%done ~] + `[%fail %watch-ack-fail u.p.sign.u.in.tin] + == +:: +++ poke + |= [=dock =cage] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass /poke %agent dock %poke cage] + ;< ~ bind:m (send-raw-card card) + (take-poke-ack /poke) +:: +++ raw-poke + |= [=dock =cage] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass /poke %agent dock %poke cage] + ;< ~ bind:m (send-raw-card card) + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ + `[%wait ~] + :: + [~ %agent * %poke-ack *] + ?. =(/poke wire.u.in.tin) + `[%skip ~] + `[%done ~] + == +:: +++ raw-poke-our + |= [app=term =cage] + =/ m (strand ,~) + ^- form:m + ;< =bowl:spider bind:m get-bowl + (raw-poke [our.bowl app] cage) +:: +++ poke-our + |= [=term =cage] + =/ m (strand ,~) + ^- form:m + ;< our=@p bind:m get-our + (poke [our term] cage) +:: +++ watch + |= [=wire =dock =path] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass watch+wire %agent dock %watch path] + ;< ~ bind:m (send-raw-card card) + (take-watch-ack wire) +:: +++ watch-one + |= [=wire =dock =path] + =/ m (strand ,cage) + ^- form:m + ;< ~ bind:m (watch wire dock path) + ;< =cage bind:m (take-fact wire) + ;< ~ bind:m (take-kick wire) + (pure:m cage) +:: +++ watch-our + |= [=wire =term =path] + =/ m (strand ,~) + ^- form:m + ;< our=@p bind:m get-our + (watch wire [our term] path) +:: +++ scry + |* [=mold =path] + =/ m (strand ,mold) + ^- form:m + ?> ?=(^ path) + ?> ?=(^ t.path) + ;< =bowl:spider bind:m get-bowl + %- pure:m + .^(mold i.path (scot %p our.bowl) i.t.path (scot %da now.bowl) t.t.path) +:: +++ leave + |= [=wire =dock] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass watch+wire %agent dock %leave ~] + (send-raw-card card) +:: +++ leave-our + |= [=wire =term] + =/ m (strand ,~) + ^- form:m + ;< our=@p bind:m get-our + (leave wire [our term]) +:: +++ rewatch + |= [=wire =dock =path] + =/ m (strand ,~) + ;< ~ bind:m ((handle ,~) (take-kick wire)) + ;< ~ bind:m (flog-text "rewatching {<dock>} {<path>}") + ;< ~ bind:m (watch wire dock path) + (pure:m ~) +:: +++ wait + |= until=@da + =/ m (strand ,~) + ^- form:m + ;< ~ bind:m (send-wait until) + (take-wake `until) +:: +++ keen + |= [=wire =spar:ames] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %arvo %a %keen spar) +:: +++ sleep + |= for=@dr + =/ m (strand ,~) + ^- form:m + ;< now=@da bind:m get-time + (wait (add now for)) +:: +++ send-wait + |= until=@da + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall + [%pass /wait/(scot %da until) %arvo %b %wait until] + (send-raw-card card) +:: +++ map-err + |* computation-result=mold + =/ m (strand ,computation-result) + |= [f=$-([term tang] [term tang]) computation=form:m] + ^- form:m + |= tin=strand-input:strand + =* loop $ + =/ c-res (computation tin) + ?: ?=(%cont -.next.c-res) + c-res(self.next ..loop(computation self.next.c-res)) + ?. ?=(%fail -.next.c-res) + c-res + c-res(err.next (f err.next.c-res)) +:: +++ set-timeout + |* computation-result=mold + =/ m (strand ,computation-result) + |= [time=@dr computation=form:m] + ^- form:m + ;< now=@da bind:m get-time + =/ when (add now time) + =/ =card:agent:gall + [%pass /timeout/(scot %da when) %arvo %b %wait when] + ;< ~ bind:m (send-raw-card card) + |= tin=strand-input:strand + =* loop $ + ?: ?& ?=([~ %sign [%timeout @ ~] %behn %wake *] in.tin) + =((scot %da when) i.t.wire.u.in.tin) + == + `[%fail %timeout ~] + =/ c-res (computation tin) + ?: ?=(%cont -.next.c-res) + c-res(self.next ..loop(computation self.next.c-res)) + ?: ?=(%done -.next.c-res) + =/ =card:agent:gall + [%pass /timeout/(scot %da when) %arvo %b %rest when] + c-res(cards [card cards.c-res]) + c-res +:: +++ send-request + |= =request:http + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass /request %arvo %i %request request *outbound-config:iris) +:: +++ send-cancel-request + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass /request %arvo %i %cancel-request ~) +:: +++ take-client-response + =/ m (strand ,client-response:iris) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign [%request ~] %iris %http-response %cancel *] + ::NOTE iris does not (yet?) retry after cancel, so it means failure + :- ~ + :+ %fail + %http-request-cancelled + ['http request was cancelled by the runtime']~ + :: + [~ %sign [%request ~] %iris %http-response %finished *] + `[%done client-response.sign-arvo.u.in.tin] + == +:: +:: Wait until we get an HTTP response or cancelation and unset contract +:: +++ take-maybe-sigh + =/ m (strand ,(unit httr:eyre)) + ^- form:m + ;< rep=(unit client-response:iris) bind:m + take-maybe-response + ?~ rep + (pure:m ~) + :: XX s/b impossible + :: + ?. ?=(%finished -.u.rep) + (pure:m ~) + (pure:m (some (to-httr:iris +.u.rep))) +:: +++ take-maybe-response + =/ m (strand ,(unit client-response:iris)) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign [%request ~] %iris %http-response %cancel *] + `[%done ~] + [~ %sign [%request ~] %iris %http-response %finished *] + `[%done `client-response.sign-arvo.u.in.tin] + == +:: +++ extract-body + |= =client-response:iris + =/ m (strand ,cord) + ^- form:m + ?> ?=(%finished -.client-response) + %- pure:m + ?~ full-file.client-response '' + q.data.u.full-file.client-response +:: +++ fetch-cord + |= url=tape + =/ m (strand ,cord) + ^- form:m + =/ =request:http [%'GET' (crip url) ~ ~] + ;< ~ bind:m (send-request request) + ;< =client-response:iris bind:m take-client-response + (extract-body client-response) +:: +++ fetch-json + |= url=tape + =/ m (strand ,json) + ^- form:m + ;< =cord bind:m (fetch-cord url) + =/ json=(unit json) (de:json:html cord) + ?~ json + (strand-fail %json-parse-error ~) + (pure:m u.json) +:: +++ hiss-request + |= =hiss:eyre + =/ m (strand ,(unit httr:eyre)) + ^- form:m + ;< ~ bind:m (send-request (hiss-to-request:html hiss)) + take-maybe-sigh +:: +:: +build-file: build the source file at the specified $beam +:: +++ build-file + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,(unit vase)) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %a case spur) + ?~ riot + (pure:m ~) + ?> =(%vase p.r.u.riot) + (pure:m (some !<(vase q.r.u.riot))) +:: +++ build-file-hard + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,vase) + ^- form:m + ;< =riot:clay + bind:m + (warp ship desk ~ %sing %a case spur) + ?> ?=(^ riot) + ?> ?=(%vase p.r.u.riot) + (pure:m !<(vase q.r.u.riot)) +:: +build-mark: build a mark definition to a $dais +:: +++ build-mark + |= [[=ship =desk =case] mak=mark] + =* arg +< + =/ m (strand ,dais:clay) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %b case /[mak]) + ?~ riot + (strand-fail %build-mark >arg< ~) + ?> =(%dais p.r.u.riot) + (pure:m !<(dais:clay q.r.u.riot)) +:: +build-tube: build a mark conversion gate ($tube) +:: +++ build-tube + |= [[=ship =desk =case] =mars:clay] + =* arg +< + =/ m (strand ,tube:clay) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %c case /[a.mars]/[b.mars]) + ?~ riot + (strand-fail %build-tube >arg< ~) + ?> =(%tube p.r.u.riot) + (pure:m !<(tube:clay q.r.u.riot)) +:: +:: +build-nave: build a mark definition to a $nave +:: +++ build-nave + |= [[=ship =desk =case] mak=mark] + =* arg +< + =/ m (strand ,vase) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %e case /[mak]) + ?~ riot + (strand-fail %build-nave >arg< ~) + ?> =(%nave p.r.u.riot) + (pure:m q.r.u.riot) +:: +build-cast: build a mark conversion gate (static) +:: +++ build-cast + |= [[=ship =desk =case] =mars:clay] + =* arg +< + =/ m (strand ,vase) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %f case /[a.mars]/[b.mars]) + ?~ riot + (strand-fail %build-cast >arg< ~) + ?> =(%cast p.r.u.riot) + (pure:m q.r.u.riot) +:: +:: Read from Clay +:: +++ warp + |= [=ship =riff:clay] + =/ m (strand ,riot:clay) + ;< ~ bind:m (send-raw-card %pass /warp %arvo %c %warp ship riff) + (take-writ /warp) +:: +++ read-file + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,cage) + ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur) + ?~ riot + (strand-fail %read-file >arg< ~) + (pure:m r.u.riot) +:: +++ check-for-file + |= [[=ship =desk =case] =spur] + =/ m (strand ,?) + ;< =riot:clay bind:m (warp ship desk ~ %sing %u case spur) + ?> ?=(^ riot) + (pure:m !<(? q.r.u.riot)) +:: +++ list-tree + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,(list path)) + ;< =riot:clay bind:m (warp ship desk ~ %sing %t case spur) + ?~ riot + (strand-fail %list-tree >arg< ~) + (pure:m !<((list path) q.r.u.riot)) +:: +:: Take Clay read result +:: +++ take-writ + |= =wire + =/ m (strand ,riot:clay) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign * ?(%behn %clay) %writ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done +>.sign-arvo.u.in.tin] + == +:: +check-online: require that peer respond before timeout +:: +++ check-online + |= [who=ship lag=@dr] + =/ m (strand ,~) + ^- form:m + %+ (map-err ,~) |=(* [%offline *tang]) + %+ (set-timeout ,~) lag + ;< ~ bind:m + (poke [who %hood] %helm-hi !>(~)) + (pure:m ~) +:: +++ eval-hoon + |= [gen=hoon bez=(list beam)] + =/ m (strand ,vase) + ^- form:m + =/ sut=vase !>(..zuse) + |- + ?~ bez + (pure:m (slap sut gen)) + ;< vax=vase bind:m (build-file-hard i.bez) + $(bez t.bez, sut (slop vax sut)) +:: +++ send-thread + |= [=bear:khan =shed:khan =wire] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %arvo %k %lard bear shed) +:: +:: Queue on skip, try next on fail %ignore +:: +++ main-loop + |* a=mold + =/ m (strand ,~) + =/ m-a (strand ,a) + =| queue=(qeu (unit input:strand)) + =| active=(unit [in=(unit input:strand) =form:m-a forms=(list $-(a form:m-a))]) + =| state=a + |= forms=(lest $-(a form:m-a)) + ^- form:m + |= tin=strand-input:strand + =* top `form:m`..$ + =. queue (~(put to queue) in.tin) + |^ (continue bowl.tin) + :: + ++ continue + |= =bowl:strand + ^- output:m + ?> =(~ active) + ?: =(~ queue) + `[%cont top] + =^ in=(unit input:strand) queue ~(get to queue) + ^- output:m + =. active `[in (i.forms state) t.forms] + ^- output:m + (run bowl in) + :: + ++ run + ^- form:m + |= tin=strand-input:strand + ^- output:m + ?> ?=(^ active) + =/ res (form.u.active tin) + =/ =output:m + ?- -.next.res + %wait `[%wait ~] + %skip `[%cont ..$(queue (~(put to queue) in.tin))] + %cont `[%cont ..$(active `[in.u.active self.next.res forms.u.active])] + %done (continue(active ~, state value.next.res) bowl.tin) + %fail + ?: &(?=(^ forms.u.active) ?=(%ignore p.err.next.res)) + %= $ + active `[in.u.active (i.forms.u.active state) t.forms.u.active] + in.tin in.u.active + == + `[%fail err.next.res] + == + [(weld cards.res cards.output) next.output] + -- +:: +++ retry + |* result=mold + |= [crash-after=(unit @ud) computation=_*form:(strand (unit result))] + =/ m (strand ,result) + =| try=@ud + |- ^- form:m + =* loop $ + ?: =(crash-after `try) + (strand-fail %retry-too-many ~) + ;< ~ bind:m (backoff try ~m1) + ;< res=(unit result) bind:m computation + ?^ res + (pure:m u.res) + loop(try +(try)) +:: +++ backoff + |= [try=@ud limit=@dr] + =/ m (strand ,~) + ^- form:m + ;< eny=@uvJ bind:m get-entropy + %- sleep + %+ min limit + ?: =(0 try) ~s0 + %+ add + (mul ~s1 (bex (dec try))) + (mul ~s0..0001 (~(rad og eny) 1.000)) +:: +:: ---- +:: +:: Output +:: +++ flog + |= =flog:dill + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass / %arvo %d %flog flog) +:: +++ flog-text + |= =tape + =/ m (strand ,~) + ^- form:m + (flog %text tape) +:: +++ flog-tang + |= =tang + =/ m (strand ,~) + ^- form:m + =/ =wall + (zing (turn (flop tang) (cury wash [0 80]))) + |- ^- form:m + =* loop $ + ?~ wall + (pure:m ~) + ;< ~ bind:m (flog-text i.wall) + loop(wall t.wall) +:: +++ trace + |= =tang + =/ m (strand ,~) + ^- form:m + (pure:m ((slog tang) ~)) +:: +++ app-message + |= [app=term =cord =tang] + =/ m (strand ,~) + ^- form:m + =/ msg=tape :(weld (trip app) ": " (trip cord)) + ;< ~ bind:m (flog-text msg) + (flog-tang tang) +:: +:: ---- +:: +:: Handle domains +:: +++ install-domain + |= =turf + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass / %arvo %e %rule %turf %put turf) +:: +:: ---- +:: +:: Threads +:: +++ start-thread + |= file=term + =/ m (strand ,tid:spider) + ;< =bowl:spider bind:m get-bowl + (start-thread-with-args byk.bowl file *vase) +:: +++ start-thread-with-args + |= [=beak file=term args=vase] + =/ m (strand ,tid:spider) + ^- form:m + ;< =bowl:spider bind:m get-bowl + =/ tid + (scot %ta (cat 3 (cat 3 'strand_' file) (scot %uv (sham file eny.bowl)))) + =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid beak file args]) + ;< ~ bind:m (poke-our %spider %spider-start poke-vase) + ;< ~ bind:m (sleep ~s0) :: wait for thread to start + (pure:m tid) +:: ++$ thread-result + (each vase [term tang]) +:: +++ await-thread + |= [file=term args=vase] + =/ m (strand ,thread-result) + ^- form:m + ;< =bowl:spider bind:m get-bowl + =/ tid (scot %ta (cat 3 'strand_' (scot %uv (sham file eny.bowl)))) + =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid byk.bowl file args]) + ;< ~ bind:m (watch-our /awaiting/[tid] %spider /thread-result/[tid]) + ;< ~ bind:m (poke-our %spider %spider-start poke-vase) + ;< ~ bind:m (sleep ~s0) :: wait for thread to start + ;< =cage bind:m (take-fact /awaiting/[tid]) + ;< ~ bind:m (take-kick /awaiting/[tid]) + ?+ p.cage ~|([%strange-thread-result p.cage file tid] !!) + %thread-done (pure:m %& q.cage) + %thread-fail (pure:m %| ;;([term tang] q.q.cage)) + == +-- diff --git a/desk/lib/terse.sh b/desk/lib/terse.sh new file mode 100644 index 0000000..23ec32a --- /dev/null +++ b/desk/lib/terse.sh @@ -0,0 +1 @@ +terser kaji.js -m reserved=['subscribe'] -m toplevel -c top_retain=['subscribe'] -c toplevel -o kaji-min.js diff --git a/desk/lib/trill.hoon b/desk/lib/trill.hoon new file mode 100644 index 0000000..7b912dd --- /dev/null +++ b/desk/lib/trill.hoon @@ -0,0 +1,249 @@ +/- post=trill-post +/+ lib=boke, sr=sortug, plib=post +|% +++ node-to-full-fake +|= p=post:post ^- full-node:post +=/ fake-children=full-graph:post %- ~(rep in children.p) +|= [=id:post acc=full-graph:post] +(put:form:post acc id *full-node:post) +p(children fake-children) +++ node-to-full +|= [p=post:post f=feed:post] ^- full-node:post +p(children (convert-children children.p f)) +++ convert-children +|= [children=(set id:post) f=feed:post] +^- full-graph:post +%- ~(rep in children) + |= [=id:post acc=full-graph:post] + =/ n (get:orm:post f id) + ?~ n acc + =/ full-node (node-to-full u.n f) + (put:form:post acc id full-node) +++ find-mention-2 +|= [our=@p l=(list inline:contents-1:post)] ^- ? +%+ roll l |= [i=inline:contents-1:post a=_|] +?. ?=(%ship -.i) a +.=(our p.i) +++ sanitize +|= c=contents:contents-1:post ^- ? +%+ roll c |= [i=block:contents-1:post acc=_&] +?. ?=(%paragraph -.i) acc +%+ roll p.i |= [ii=inline:contents-1:post iacc=_acc] +?. ?=(%link -.ii) iacc +?~ (de-purl:html href.ii) .n .y +++ post-size +|= c=contents:contents-1:post +=| count=@ +|- +?~ c count +=/ lc=@ +?- -.i.c +%tasklist 0 :: TODO +%paragraph (inline-size p.i.c) +%blockquote (inline-size p.i.c) +%heading (lent (trip p.i.c)) +%list (inline-size p.i.c) +%media (media-size media.i.c) +%codeblock +?: (gth (lent (trip lang.i.c)) 400) 10.000 +(lent (trip code.i.c)) +%eval (lent (trip hoon.i.c)) +%ref +?: (gth (lent (trip app.i.c)) 400) 10.000 +(roll path.i.c |=([i=@t a=@] (add a (lent (trip i))))) +%json +?: (gth (lent (trip content.i.c)) 5.000) 10.000 +?: (gth (lent (trip origin.i.c)) 1.000) 10.000 +0 +%table +%+ roll rows.i.c |= [i=(list contents:contents-1:post) a=@] +=/ inner-count=@ +%+ roll i |= [ii=contents:contents-1:post ia=@] +(add ia (post-size ii)) +(add inner-count a) +== +$(c t.c, count (add count lc)) +++ inline-size +|= l=(list inline:contents-1:post) ^- @ +=| count=@ +|- +?~ l count +=/ lc=@ +?+ -.i.l (lent (trip p.i.l)) +%date 0 :: TODO +%note 0 :: TODO +%break 0 +%ruby (lent (trip p.i.l)) +%link +?: (gth (lent (trip href.i.l)) 400) 10.000 +(lent (trip show.i.l)) +== +$(l t.l, count (add count lc)) +++ media-size +|= =media:contents-1:post ^- @ +?- -.media +%video (lent (trip p.media)) +%audio (lent (trip p.media)) +%images %+ roll p.media +|= [[url=@t caption=@t] a=@] +%+ add a (lent (trip caption)) +== +:: search +++ text-search +|= [q=@t p=post:post case=?] ^- tape +=/ t (content-to-md:lib contents.p) +=? t !case (cass t) +=/ qt ?: case (trip q) (cass (trip q)) +=/ i (find qt t) +?~ i "" +=/ start ?: (lte u.i 50) 0 (sub u.i 50) +?: .=(start 0) +"{(swag [start 100] t)}..." +"...{(swag [start 100] t)}..." + +++ search +|= [q=@t p=post:post] ^- ? +?~ contents.p .n +=/ latest=content-list:post val:head:(pop:corm:post contents.p) +=/ in-tags %+ roll ~(tap in tags.p) |= [i=cord a=_|] +?: (contains i q) %& a +=/ in-blocks %+ roll latest |= [i=block:contents-1:post a=_|] +?: ?- -.i + %paragraph (in-inline p.i q) + %blockquote (in-inline p.i q) + %list (in-inline p.i q) + %heading (contains p.i q) + %codeblock (contains code.i q) + %eval (contains hoon.i q) + %json (contains content.i q) + %media (in-media media.i q) + %ref %| :: TODO + %table %| :: TODO + %tasklist .n :: TODO +== %& a +?| in-tags in-blocks == +++ contains +|= [container=cord query=cord] ^- ? +?~ (find (trip query) (trip container)) %| %& +++ in-media +|= [=media:contents-1:post q=@t] ^- ? +?. ?=(%images -.media) (contains p.media q) +%+ roll p.media |= [[url=cord caption=cord] a=_|] +?: (contains caption q) %& a +:: +++ text-search2 +|= [q=@t p=post:post case=?] ^- @t +?~ contents.p '' +=/ bl=(list block:contents-1:post) val:head:(pop:corm:post contents.p) +=| snippet=@t +|- +?~ bl snippet +:: TODO proper counts +?: (gth (met 3 snippet) 50) snippet +=/ ns +?+ -.i.bl snippet + %paragraph (from-inline p.i.bl q case) + %blockquote (from-inline p.i.bl q case) + %list (from-inline p.i.bl q case) + :: %heading (cfind:sr q p.i .n) + :: %codeblock (cfind:sr q code.i .n) + :: %eval (cfind:sr q hoon.i .n) + :: %json (cfind:sr q content.i .n) + :: %media (in-media2 media.i q) + %ref snippet :: TODO + %table snippet :: TODO + %tasklist snippet +== +$(bl t.bl, snippet (cat 3 snippet ns)) +++ from-inline +|= [l=(list inline:contents-1:post) q=@t case=?] ^- @t +=| snippet=@t +|- +?~ l snippet +?: (gth (met 3 snippet) 50) snippet +=/ r +?+ -.i.l (cfindi:sr q p.i.l .n) +%break .n +%date .n :: TODO +%note .n ::TODO +%ship (cfindi:sr q (scot %p p.i.l) .n) +%link (cat 3 (cfindi:sr q href.i.l .n) (cfindi:sr q show.i.l .n)) +%ruby (cat 3 (cfindi:sr q p.i.l .n) (cfindi:sr q q.i.l .n)) +== +$(l t.l, snippet (cat 3 snippet r)) + +++ search2 +|= [q=@t p=post:post] ^- ? +?~ contents.p .n +=/ latest=content-list:post val:head:(pop:corm:post contents.p) +=/ in-tags %+ roll ~(tap in tags.p) |= [i=cord a=_|] +?: (cfind:sr q i .n) %& a +=/ in-blocks %+ roll latest |= [i=block:contents-1:post a=_|] +?: ?- -.i + %paragraph (in-inline2 p.i q) + %blockquote (in-inline2 p.i q) + %list (in-inline2 p.i q) + %heading (cfind:sr q p.i .n) + %codeblock (cfind:sr q code.i .n) + %eval (cfind:sr q hoon.i .n) + %json (cfind:sr q content.i .n) + %media (in-media2 media.i q) + %ref %| :: TODO + %table %| :: TODO + %tasklist .n +== %& a +?| in-tags in-blocks == +++ in-media2 +|= [=media:contents-1:post q=@t] ^- ? +?. ?=(%images -.media) (cfind:sr q p.media .n) +%+ roll p.media |= [[url=cord caption=cord] a=_|] +?: (cfind:sr q url .n) %& a +++ in-inline2 +|= [l=(list inline:contents-1:post) q=@t] ^- ? +|- +?~ l .n +=/ i i.l +=/ r=? +?+ -.i (cfind:sr q p.i .n) +%break .n +%date .n +%note .n +%ship (cfind:sr q (scot %p p.i) .n) +%link ?|((cfind:sr q href.i .n) (cfind:sr q show.i .n)) +%ruby ?|((cfind:sr q p.i .n) (cfind:sr q q.i .n)) +== +?| r $(l t.l) == +:: +++ in-inline +|= [l=(list inline:contents-1:post) q=@t] ^- ? +%+ roll l |= [i=inline:contents-1:post a=_|] +?: ?+ -.i (contains p.i q) +%break %| +%date .n +%note ?|((contains id.i q) (in-inline text.i q)) +%ship (contains (scot %p p.i) q) +%link ?|((contains href.i q) (contains show.i q)) +%ruby ?|((contains p.i q) (contains q.i q)) +== %& a +++ is-my-reply +|= [p=post:post r=post:post our=@p] ^- ? +?~ parent.r .n +?& .=(author.r our) !.=(author.p our) == +++ is-thread-child +|= [p=post:post r=post:post our=@p] ^- ? +?~ parent.r .n +?& .=(author.r our) .=(author.p our) == +++ tag-search +|= [l=(list @t) =feed:post] ^- (list full-node:post) +%+ roll (tap:orm:post feed) |= [[* =post:post] acc=(list full-node:post)] +=/ found +=/ has .y +|- +?~ l has +?& has +=/ ns (~(has in tags.post) (crip (cass (trip i.l)))) +$(l t.l, has ns) +== +?. found acc :_ acc +(node-to-full:plib post feed) +-- diff --git a/desk/lib/trill/ui.hoon b/desk/lib/trill/ui.hoon new file mode 100644 index 0000000..8f05936 --- /dev/null +++ b/desk/lib/trill/ui.hoon @@ -0,0 +1,249 @@ +/- tp=trill-post +/+ sr=sortug +:: /+ md=markdown +|% +++ abbr +|= [t=@t c=@ud] ^- @t + =/ size (met 3 t) + ?: (lte size c) t + %^ cat 3 + (cut 3 [0 c] t) + '...' +++ abbr-t +|= [t=tape c=@ud] ^- tape + =/ size (lent t) + ?: (lte size c) t + %+ weld (scag c t) + "..." +:: tape -> post:trill, parsing user input from Sail +++ parse :: Markdown parser. Actually udon parser but it'll do +|= s=tape ^- (unit marl:hoot) :: finally +:: TODO check out parse:chat-graph.hoon +:: Annoying it requires a line break but then parses it as a space wtf +=, vast +(rust s cram:(sail .y)) ++$ heading $?(%h1 %h2 %h3 %h4 %h5 %h6) +++ tokenize +|= s=@t ^- content-list:tp + =/ t (weld (trip s) "\0a") + =/ parsed (parse t) + :: =/ parsed2 (parse:md t) + :: ~& > diary-parser=parsed2 + :: \0a can't be followed by a space. ever. those are the rules + ?~ parsed ~& error-parsing-markdown=t ~ + (marl-to-cl u.parsed) +++ marl-to-cl +|= =marl:hoot ^- content-list:tp + %- flop + %+ roll marl + |= [=tuna:hoot acc=content-list:tp] + :: man this is an annoying type if I ever saw one + ?@ -.tuna acc + =/ blk (manx-to-block tuna) + ?~ blk acc :_ acc u.blk +++ manx-to-block + |= =manx:hoot ^- (unit block:tp) + ?+ n.g.manx ~ + heading %- some [%heading (phead n.g.manx c.manx)] + %p %- some [%paragraph (inline-list c.manx)] + %blockquote %- some [%blockquote (inline-list c.manx)] + %pre %- some [%codeblock (pre c.manx)] + %hr %- some [%paragraph ~[[%break ~]]] + %ul %- some [%list (list-items c.manx) .n] + %ol %- some [%list (list-items c.manx) .y] + :: %table %- some (table-rows c.manx) + == +:: ++ table-row +:: |= =manx:hoot ^- (list cell:table:tp) +:: ?. ?=(%td n.g.manx) ~ + +:: ++ table-rows +:: |= =marl:hoot ^- table:tp +:: =/ a +:: %+ roll marl |= [=manx:hoot acc=table:tp] +:: :- %table +:: ?: ?=(%th n.g.manx) :_ rows.acc [(marl-to-cl c.manx) headers.acc] +:: ?. ?=(%tr n.g.manx) :- headers.acc +:: :- headers.acc rows.acc + +++ list-items +|= =marl:hoot ^- (list li:clist:tp) +%- flop +%+ roll marl |= [=tuna:hoot acc=(list li:clist:tp)] +?@ -.tuna acc +?. ?=(%li n.g.tuna) acc :_ acc (marl-to-cl c.tuna) +++ phead +|= [h=heading c=marl:hoot] ^- [p=cord q=heading] +:- (get-tag-text c) h +++ inline-list + |= c=marl:hoot ^- (list inline:tp) + %- flop + %+ roll c + |= [=tuna:hoot acc=(list inline:tp)] + ?@ -.tuna acc :_ acc (inline tuna) + ++ inline + |= =manx:hoot ^- inline:tp + ?: ?=(%$ n.g.manx) [%text (get-attrs-text a.g.manx)] + =/ text=@t (get-tag-text c.manx) + ?+ n.g.manx [%text text] + %i [%italic text] + %b [%bold text] + %code [%codespan text] + %br [%break ~] + %a :+ %link (get-attrs-text a.g.manx) (get-tag-text c.manx) + %img :+ %link (get-attr-text a.g.manx %src) (get-attr-text a.g.manx %alt) + == +:: +++ reduce-block +|= c=marl:hoot ^- @t +%+ roll c +|= [=tuna:hoot acc=@t] +?@ -.tuna acc +?+ n.g.tuna acc +%p (get-tag-text c.tuna) +== +++ get-attr-text +|= [a=mart:hoot attr=@tas] ^- @t +%- crip %- flop +%+ roll a +|= [[n=mane v=(list beer:hoot)] acc=tape] +?. .=(attr n) acc +%+ roll v +|= [b=beer:hoot acc=tape] +?^ b acc [b acc] +++ get-attrs-text :: this assumes we don't care about which attr, which we usually don't +|= a=mart:hoot ^- @t +:: ?: (gte (lent a) 1) +%- crip %- flop +%+ roll a +|= [[n=mane v=(list beer:hoot)] acc=tape] +%+ roll v +|= [b=beer:hoot acc=tape] +?^ b acc [b acc] +++ get-tag-text +|= c=marl:hoot ^- @t +:: there's only really one child in these things +%+ roll c +|= [=tuna:hoot acc=@t] +?@ -.tuna acc +%- crip +%- flop +%+ roll a.g.tuna +|= [[n=mane v=(list beer:hoot)] acc=tape] +%+ roll v +|= [b=beer:hoot acc=tape] +?^ b acc [b acc] + +++ pre +|= c=marl:hoot ^- [cord cord] +:_ '' :: lang not supported, duh +%+ roll c +|= [=tuna:hoot acc=@t] +?@ -.tuna acc +(get-attrs-text a.g.tuna) + + +++ parse-tags +|= t=@t ^- (unit (set @t)) + =/ lst (rush t (csplit:parsing:sr com)) + ?~ lst ~ (some (sy u.lst)) +++ tape-to-cm +|= =tape ^- content-map:tp +(gas:corm:tp *content-map:tp [*@da (tokenize (crip tape))]~) +:: post:trill -> manx + +:: post:trill -> (markdown) tape for display on sail +++ block-to-md +|= b=block:tp ^- tape + ?+ -.b "" +%paragraph + %^ foldi:sr p.b "" |= [in=@ud i=inline:tp acc=tape] + =/ il (inline-to-tape i) + ?: .=(+(in) (lent p.b)) + "{acc}{il}" + "{acc}{il} " +%blockquote + %+ weld "> " + %^ foldi:sr p.b "" |= [in=@ud i=inline:tp acc=tape] + =/ il (inline-to-tape i) + ?: .=(+(in) (lent p.b)) + "{acc}{il}" + "{acc}{il} " +%list + %^ foldi:sr p.b "" |= [in=@ud =li:tp acc=tape] + =/ li-tape (content-list-to-md li) + =/ line ?: ordered.b + "{<+(in)>}. {li-tape}" + "- {li-tape}" + ?: .=(+(in) (lent p.b)) + "{acc}{line}" + "{acc}{line}\0a" +%media + ?+ -.media.b "})" +%images %^ foldi:sr p.media.b "" |= [i=@ud [url=@t caption=@t] acc=tape] + =/ line "})" + ?: .=(+(i) (lent p.media.b)) + "{acc}{line}" + "{acc}{line}\0a" + == +%codeblock + """ + ``` + {(trip code.b)} + ``` + """ +%heading =/ dashes=tape ?- q.b + %h1 "# " + %h2 "## " + %h3 "### " + %h4 "#### " + %h5 "##### " + %h6 "###### " + == "{dashes}{(trip p.b)}" +%tasklist "" ::TODO + :: + :: %table acc + :: %eval acc + :: %ref acc + :: %json acc + == +++ content-list-to-md +|= =content-list:tp ^- tape + %^ foldi:sr content-list "" |= [i=@ud b=block:tp acc=tape] + =/ block-tape (block-to-md b) + ?: .=(+(i) (lent content-list)) + "{acc}{block-tape}" + "{acc}{block-tape}\0a\0a" +++ content-to-md +|= c=content-map:tp ^- tape + ?~ c "" + =/ latest=(list block:tp) val:head:(pop:corm:tp c) + (content-list-to-md latest) +++ inline-to-tape +|= i=inline:tp ^- tape + ?- -.i + %text (trip p.i) + %italic "_{(trip p.i)}_" + %bold "*{(trip p.i)}*" + %strike "~~{(trip p.i)}~~" + %ship (scow %p p.i) + %codespan "`{(trip p.i)}`" + %link "[{(trip show.i)}]({(trip href.i)})" + %break "\0a" + :: TODO custom syntax + %date + =/ t (time:enjs:format p.i) + ?. ?=(%n -.t) "" (trip p.t) + %note "" :: TODO + %underline (trip p.i) + %sup (trip p.i) + %sub (trip p.i) + %ruby (trip p.i) + == +++ tags-to-tape +|= t=(set @t) ^- tape + %^ foldi:sr ~(tap in t) "" |= [i=@ud c=@t acc=tape] + ?: .=(+(i) ~(wyt in t)) + "{acc}{(trip c)}" + "{acc}{(trip c)}," +-- diff --git a/desk/lib/trill/utils.hoon b/desk/lib/trill/utils.hoon new file mode 100644 index 0000000..ffff8b8 --- /dev/null +++ b/desk/lib/trill/utils.hoon @@ -0,0 +1,1054 @@ +/- tp=trill-post, tlonc=tlon-channels, *boke, contact +/+ sr=sortug, ui=trill-ui, const=constants +|% +++ user-profile +|= [u=@p =bowl:gall] ^- res:contact +=/ io ~(. io:sr bowl) +=/ has-contacts .^(? %gu (weld (scry-pad:io %contacts) /$)) +=/ has-whom .^(? %gu (weld (scry-pad:io %whom) /$)) +=/ tact ?. has-contacts ~ +=/ rolo (scry:io %contacts /all rolodex:contact) +=/ utact (~(get by rolo) u) +=/ prof ?~ utact ~ for.u.utact +?~ prof ~ ?~ con.prof ~ (some con.prof) + +=/ whom ?. has-whom ~ +=/ whoms (scry:io %whom /1/contacts/mars whoms:contact) +(~(get by whoms) [%.y u]) +=/ res +[u tact whom] +res +++ flatten-fn +|= fn=full-node:tp ^- (list post:tp) + :: ~> %bout.[0 %flattening] + =/ child-list (tap:form:tp children.fn) + :- p.fn + :: =/ l %+ turn child-list |= [* f=full-node:tp] p.f + =/ flist=(list post:tp) + =| l=(list post:tp) + |- + ?~ child-list l + =/ child=full-node:tp +.i.child-list + =/ nl (weld l (flatten-fn child)) + $(child-list t.child-list, l nl) + %+ sort flist |= [a=post:tp b=post:tp] (gth id.b id.a) + +++ get-children-page +|= [fn=full-node:tp r=page-req:tp] ^- spage:tp + =/ l (tap:form:tp children.fn) + =| p=spage:tp + |- + ?~ l + %= p + p %+ sort p.p |= [a=post:tp b=post:tp] (gth id.b id.a) + == + =/ node=full-node:tp val.i.l + =/ id id.p.node + ?. (page-cond id count.p r) $(l t.l) :: TODO mmm can i exit here + =/ subpage (get-children-page node r) + =/ new-posts=(list post:tp) p.subpage + =/ oldest ?~ older.p older.subpage + ?: (lth id u.older.p) older.subpage older.p + =/ newest ?~ newer.p newer.subpage + ?: (gth id u.newer.p) newer.subpage newer.p + %= $ + p.p (weld p.p [p.node new-posts]) + older.p oldest + newer.p newest + count.p +(count.p) + l t.l + == +++ get-siblings-page +|= fn=full-node:tp ^- spage:tp + =/ pg (get-children-page fn [~ ~ thread-page-size:const]) + =/ ind (find ~[p.fn] p.pg) + ?~ ind *spage:tp + =/ start=@ ?: (lth u.ind thread-page-size:const) 0 (sub u.ind thread-page-size:const) + %= pg + p (swag [start thread-page-size:const] p.pg) + == +:: ++ get-siblings-page-2 +:: |= l=(list post:tp) ^- spage:tp +:: =/ pg (get-children-page fn [~ ~ thread-page-size:const]) +:: =/ ind (find ~[p] p.pg) +:: ?~ ind *spage:tp +:: =/ start=@ ?: (lth u.ind thread-page-size:const) 0 (sub u.ind thread-page-size:const) +:: %= pg +:: p (swag [start thread-page-size:const] p.pg) +:: == + + +++ flatten-fn-2 +|= fn=full-node:tp ^- (list post:tp) + :: ~> %bout.[0 %flattening-2] + =/ child-list (tap:form:tp children.fn) + :- p.fn + %- sort :_ |= [a=post:tp b=post:tp] (gth id.b id.a) + |- ^- (list post:tp) + ?~ child-list ~ + %+ weld (flatten-fn-2 +.i.child-list) + $(child-list t.child-list) + +++ common-thread + |= [p=post:tp f=gfeed:tp] ^- @ud + =/ pid thread.p + =/ l (tap:gorm:tp f) + %- lent + %+ skim l |= [k=pid:tp v=post:tp] + .= thread.v pid +:: ++ flatten-4 +:: |= p=post:tp ^- (list pid:tp) +:: ~> %bout.[0 %flattening-4] +:: =/ child-list ~(tap in children.fn) +:: =/ =pid:tp [author.p id.p] +:: :- pid +:: |- ^- (list post:tp) +:: ?~ child-list ~ +:: =/ child-post (~(get by feed) pid) +:: %+ weld (flatten-fn-p child-post) +:: $(child-list t.child-list) +:: +$ ll (list pid:tp) +:: ++ flatten-raw +:: |= [l=ll acc=ll] ^- ll +:: ?~ l acc +:: $(l t.l, acc [i.l acc]) + + +++ node-to-full-fake +|= p=post:tp ^- full-node:tp + =/ fake-children=full-graph:tp %- ~(rep in children.p) + |= [=pid:tp acc=full-graph:tp] + (put:form:tp acc pid *full-node:tp) + :- p fake-children +++ node-to-full +|= [p=post:tp f=gfeed:tp] ^- full-node:tp + =/ children (~(del in children.p) [author.p id.p]) :: else infinite loop. not that it should happen at all + :- p (convert-children children f) + ++ convert-children + |= [children=(set pid:tp) f=gfeed:tp] + ^- full-graph:tp + %- ~(rep in children) + |= [=pid:tp acc=full-graph:tp] + =/ n (get:gorm:tp f pid) + ?~ n ~& child-not-found=pid acc + =/ full-node (node-to-full u.n f) + (put:form:tp acc pid full-node) +++ sanitize +|= c=content-list:tp ^- ? +%+ roll c |= [i=block:tp acc=_&] +?. ?=(%paragraph -.i) acc +%+ roll p.i |= [ii=inline:tp iacc=_acc] +?. ?=(%link -.ii) iacc +?~ (de-purl:html href.ii) .n .y +++ block-size +|= =block:tp ^- @ud +?- -.block +%tasklist 0 :: TODO +%paragraph (inline-size p.block) +%blockquote (inline-size p.block) +%heading (lent (trip p.block)) +%media (media-size media.block) +%codeblock +?: (gth (lent (trip lang.block)) 400) 10.000 +(lent (trip code.block)) +%eval (lent (trip hoon.block)) +%ref +?: (gth (lent (trip app.block)) 400) 10.000 +(roll path.block |=([i=@t a=@] (add a (lent (trip i))))) +%json +?: (gth (lent (trip content.block)) 5.000) 10.000 +?: (gth (lent (trip origin.block)) 1.000) 10.000 +0 +%list %+ roll p.block |= [c=content-list:tp a=@ud] %+ add a +%+ roll c |= [b=block:tp aa=@ud] (add aa (block-size b)) +:: %table +:: %+ roll rows.block |= [i=(list contents:tp) a=@] +:: =/ inner-count=@ +:: %+ roll i |= [ii=contents:tp ia=@] +:: (add ia (post-size ii)) +:: (add inner-count a) +== +++ post-size +|= c=content-list:tp +=| count=@ +|- +?~ c count +=/ lc=@ (block-size i.c) +$(c t.c, count (add count lc)) +++ inline-token-size +|= i=inline:tp ^- @ud +?+ -.i (lent (trip p.i)) +%break 1 +%date 1 +%note (add (met 3 id.i) 10):: TODO) +%ship (lent (trip (scot %p p.i))) +%ruby (lent (trip p.i)) +%link +?: (gth (lent (trip href.i)) 400) 10.000 :: to prevent hacking through a huge href string +(lent (trip show.i)) +== +++ reduce-inline +|= [i=inline:tp chars=@ud] ^+ i +?- -.i +%break i +%date i +%note i :: TODO +%ship [%text (crip (weld (scag chars (trip (scot %ud p.i))) "..."))] +%ruby i(p (crip (scag chars (trip p.i)))) +%link i(show (crip (scag chars (trip show.i)))) +%bold + [-.i (crip (scag chars (trip +.i)))] +%codespan + [-.i (crip (scag chars (trip +.i)))] +%italic + [-.i (crip (scag chars (trip +.i)))] +%strike + [-.i (crip (scag chars (trip +.i)))] +%sub + [-.i (crip (scag chars (trip +.i)))] +%sup + [-.i (crip (scag chars (trip +.i)))] +%text + [-.i (crip (weld (scag chars (trip +.i)) "..."))] +%underline + [-.i (crip (scag chars (trip +.i)))] +== +++ inline-size +|= l=(list inline:tp) ^- @ +=| count=@ud +|- + ?~ l count + =/ lc=@ud (inline-token-size i.l) + $(l t.l, count (add count lc)) + + +++ media-size +|= =media:tp ^- @ +?- -.media +%video (lent (trip p.media)) +%audio (lent (trip p.media)) +%images %+ roll p.media +|= [[url=@t caption=@t] a=@] +%+ add a (add (met 3 url) (met 3 caption)) +== + +++ search +|= [q=@t p=post:tp] ^- ? +=/ latest=content-list:tp val:head:(pop:corm:tp contents.p) +?| (in-tags ~(tap in tags.p) q) (in-blocks latest q) == +++ in-tags +|= [tl=(list @t) q=@t] ^- ? +|- +?~ tl .n +?: (contains i.tl q) .y $(tl t.tl) +++ in-blocks +|= [bl=content-list:tp q=@t] ^- ? +|- +?~ bl .n +?: (in-block i.bl q) .y $(bl t.bl) +++ in-block +|= [i=block:tp q=@t] ^- ? +?- -.i + %paragraph (in-inline p.i q) + %blockquote (in-inline p.i q) + %heading (contains p.i q) + %codeblock (contains code.i q) + %eval (contains hoon.i q) + %json (contains content.i q) + %media (in-media media.i q) + %ref %| :: TODO + :: %table %| :: TODO + %tasklist .n :: TODO + %list + |- + ?~ p.i .n + ?: (in-blocks i.p.i q) .y $(p.i t.p.i) +== +++ in-media +|= [=media:tp q=@t] ^- ? +?. ?=(%images -.media) (contains p.media q) +=/ l p.media +|- +?~ l .n +?: ?| (contains url.i.l q) (contains caption.i.l q) == .y $(l t.l) +++ in-inline +|= [l=(list inline:tp) q=@t] ^- ? +|- +?~ l .n +=/ i i.l +=/ has ?+ -.i (contains p.i q) +%break %| +%ship (contains (scot %p p.i) q) +%date .n :: TODO +%note ?|((contains id.i q) (in-inline text.i q)) +%link ?|((contains href.i q) (contains show.i q)) +%ruby ?|((contains p.i q) (contains q.i q)) +== +?: has .y $(l t.l) +++ is-my-reply +|= [p=post:tp r=post:tp our=@p] ^- ? +?~ parent.r .n +?& .=(author.r our) !.=(author.p our) == +++ is-thread-child +|= [p=post:tp r=post:tp our=@p] ^- ? +?~ parent.r .n +?& .=(author.r our) .=(author.p our) == +++ houyi +|= children=full-graph:tp ^- @ud + ?~ children 0 + =/ lst (tap:form:tp children) + %+ add (lent lst) + %+ roll lst + |= [[=pid:tp n=full-node:tp] acc=@ud] + (add acc (houyi children.n)) + +++ latest-contents +|= cm=content-map:tp ^- content-list:tp + =/ latest (pry:corm:tp cm) + ?~ latest ~ +.u.latest +:: + +++ abbreviate-post +|= [cm=content-map:tp max-chars=@ud] ^- content-list:tp + =/ c (latest-contents cm) + :: we reduce the list of blocks. We count how many characters are there in each block. + :: If the block fits in our count, we insert the block in the filtered list. + :: If not, we cut the content of the box until it does. + =/ ret=content-list:tp + =< +< + %^ spin c [bl=*content-list:tp available=max-chars] + |= [b=block:tp [bl=_c available=@ud]] + :: We must return the same data type as the input + :: We don't want to map on the individual block so return as is + :- b + :: The state tho is what we're playing with. + :: We pass the current block and the available char count to another function + =/ cut=[(unit block:tp) @ud] (cut-block b available) + :: That function checks whether the block fits within the available count. + :: It returns a maybe block and the remaining count + :: If null, we return the list as is + ?~ -.cut [bl available] + :: If we get a block back, we add that to our block list, and update the available count + [[u.-.cut bl] +.cut] + (flop ret) +++ cut-block +:: now let's go inside the block +|= [b=block:tp available=@ud] +^- [(unit block:tp) @ud] +?+ -.b [~ 0] +:: :: This we can cut +%paragraph =/ inlines (cut-inlines p.b available) +?~ -.inlines [~ available] :- `[-.b -.inlines] +.inlines +:: :: these must go whole or nothing +:: :: %blockquote +:: :: %heading +:: :: %list +:: :: %media +:: :: %eval +:: :: %poll +:: :: %ref +:: :: %json +:: :: %table +== +++ cut-inlines +|= [li=(list inline:tp) available=@ud] ^+ [li available] +?: .=(0 available) [~ 0] +:: We spin again +=/ ret=[_li @ud] +=/ initial-state [*(list inline:tp) available] +=< + +%^ spin li initial-state +|= [l=inline:tp [nl=_li available=@ud]] +:: Again we're not mapping over the tokens, just mutating an internal state +:- l +:: If no more chars available we return of course +?: .=(0 available) [nl available] +:: We look at the size of the current token +=/ size (inline-token-size l) +:: If the size is smaller than available, we add to new list, and substract from available +?: (lte size available) +[[l nl] (sub available size)] +:: If size is bigger than available we reduce the token, insert to list, set avaibable as 0 +=/ reduced (reduce-inline l available) +[[reduced nl] 0] + +[(flop -.ret) +.ret] + +:: +:: +:: search +++ text-search +|= [q=@t length=@ud p=post:tp case=?] ^- tape + :: ~> %bout.[0 %text-search] + =/ t (content-to-md:ui contents.p) + :: ~2020.7.31..23.51.21 + +:: =/ hstk ?: case t (cass t) +:: =/ nedl ?: case (trip q) (cass (trip q)) +:: =/ i (find nedl hstk) +:: ?~ i "" +:: =/ start ?: (lte u.i length) 0 (sub u.i length) +:: ?: .=(start 0) +:: "{(swag [start (mul 2 length)] t)}..." +:: "...{(swag [start (mul 2 length)] t)}..." + "" + +++ contains +|= [container=cord query=cord] ^- ? +?~ (find (trip query) (trip container)) %| %& +:: +++ text-search-ind +|= [q=@t length=@ud p=post:tp case=?] ^- @t + :: ~> %bout.[0 %text-search-ind] + ?~ contents.p '' + =/ bl=(list block:tp) val:head:(pop:corm:tp contents.p) + =| ob=(list block:tp) + |- + ?~ bl '' + :: TODO proper counts + =/ i i.bl + =/ r=(unit completion) + ?+ -.i ~ + %paragraph (inline-ind p.i q length case) + %blockquote (inline-ind p.i q length case) + :: :: %list (from-inline p.i.bl q case) + %heading (cfind-index:sr q p.i length .n) + %codeblock (cfind-index:sr q code.i length .n) + %eval (cfind-index:sr q hoon.i length .n) + %json (cfind-index:sr q content.i length .n) + :: %media (in-media2 media.i q) + :: %ref snippet :: TODO + :: %table snippet :: TODO + :: %tasklist snippet + == + ?~ r $(bl t.bl, ob [i.bl ob]) + ?: (gte (met 3 snip.u.r) length) snip.u.r :: victory + =. u.r + ?. (gth left-amari.u.r 0) u.r :: go fetch stuff on the left + =/ left-fill=@t (fill-up-block left-amari.u.r ob .y) + =/ added (cat 3 left-fill snip.u.r) + u.r(snip added, left-amari (sub left-amari.u.r (met 3 left-fill))) + =. u.r + ?. (gth right-amari.u.r 0) u.r :: go fetch stuff on the right + =/ right-fill=@t (fill-up-block right-amari.u.r t.bl .n) + =/ added (cat 3 snip.u.r right-fill) + u.r(snip added, right-amari (sub right-amari.u.r (met 3 right-fill))) + + snip.u.r + + ++$ completion [snip=@t left-amari=@ud right-amari=@ud] +++ inline-ind +|= [l=(list inline:tp) q=@t length=@ud case=?] ^- (unit completion) + =| ob=(list inline:tp) + |- + ?~ l ~ + =/ r=(unit completion) + ?+ -.i.l (cfind-index:sr q p.i.l length .n) +%break ~ +%date ~ :: TODO +%note ~ ::TODO +%ship (cfind-index:sr q (scot %p p.i.l) length .n) +%link (cfind-index:sr q (cat 3 href.i.l show.i.l) length .n) +%ruby (cfind-index:sr q (cat 3 p.i.l q.i.l) length .n) + == + ?~ r $(l t.l, ob [i.l ob]) + ?: (gte (met 3 snip.u.r) length) r :: exit condition + =. u.r + ?. (gth left-amari.u.r 0) u.r :: go fetch stuff on the left + =/ left-fill=@t (fill-up left-amari.u.r ob .y) + =/ added (cat 3 left-fill snip.u.r) + u.r(snip added, left-amari (sub left-amari.u.r (met 3 left-fill))) + =. u.r + ?. (gth right-amari.u.r 0) u.r :: go fetch stuff on the right + =/ right-fill=@t (fill-up right-amari.u.r t.l .n) + =/ added (cat 3 snip.u.r right-fill) + u.r(snip added, right-amari (sub right-amari.u.r (met 3 right-fill))) + + r + +:: +++ fill-up-block +|= [length=@ud l=(list block:tp) backwards=?] ^- @t + =| acc=@t + |- + ?~ l acc + ?: ?=(%paragraph -.i.l) (fill-up length p.i.l backwards) + ?: ?=(%blockquote -.i.l) (fill-up length p.i.l backwards) + =/ string=@t + ?+ -.i.l '' + %heading p.i.l + %codeblock code.i.l + %eval hoon.i.l + %json content.i.l + :: %media (in-media2 media.i q) + :: %ref snippet :: TODO + :: %table snippet :: TODO + :: %tasklist snippet + :: :: %list (from-inline p.i.bl q case) + == + =. acc ?: backwards + =/ end (met 3 string) + =/ start ?: (lth end length) 0 (sub end length) + =/ piece=@t (cut 3 [start end] string) + (cat 3 piece acc) + :: forwards + =/ piece=@t (cut 3 [0 length] string) + (cat 3 acc piece) + + =/ size (met 3 acc) + ?: .=(size length) acc :: exit condition + ?: (gte size length) '' :: bug + $(l t.l, length (sub length size)) + +++ fill-up +|= [length=@ud l=(list inline:tp) backwards=?] ^- @t + =| acc=@t + |- + ?~ l acc + =/ string=@t + ?+ -.i.l p.i.l +%break '' +%date '' :: TODO +%note '' ::TODO +%ship (scot %p p.i.l) +%link (cat 3 href.i.l show.i.l) +%ruby (cat 3 p.i.l q.i.l) + == + =. acc ?: backwards + =/ end (met 3 string) + =/ start ?: (lth end length) 0 (sub end length) + =/ piece=@t (cut 3 [start end] string) + (cat 3 piece acc) + :: forwards + =/ piece=@t (cut 3 [0 length] string) + (cat 3 acc piece) + + + =/ size (met 3 acc) + ?: .=(size length) acc :: exit condition + ?: (gth size length) '' :: this should never happen + $(l t.l, length (sub length size)) + +:: +++ text-search2 +|= [q=@t length=@ud p=post:tp case=?] ^- @t + ~> %bout.[0 %text-search] + ?~ contents.p '' + =/ bl=(list block:tp) val:head:(pop:corm:tp contents.p) + =| snippet=@t + |- + ?~ bl snippet + :: TODO proper counts + ?: (gth (met 3 snippet) length) snippet + =/ i i.bl + =/ ns + ?+ -.i snippet + %paragraph (from-inline p.i q length case) + :: %blockquote (from-inline p.i q length case) + :: :: %list (from-inline p.i.bl q case) + :: %heading (cfind:sr q p.i .n) + :: %codeblock (cfind:sr q code.i .n) + :: %eval (cfind:sr q hoon.i .n) + :: %json (cfind:sr q content.i .n) + :: %media (in-media2 media.i q) + :: %ref snippet :: TODO + :: %table snippet :: TODO + :: %tasklist snippet + == + $(bl t.bl, snippet (cat 3 snippet ns)) +++ from-inline +|= [l=(list inline:tp) q=@t length=@ud case=?] ^- @t + =| snippet=@t + |- + ?~ l snippet + ?: (gth (met 3 snippet) length) snippet + =/ r + ?+ -.i.l (cfindi:sr q p.i.l .n) + %break '\0a' + %date .n :: TODO + %note .n ::TODO + %ship (cfindi:sr q (scot %p p.i.l) .n) + %link (cat 3 (cfindi:sr q href.i.l .n) (cfindi:sr q show.i.l .n)) + %ruby (cat 3 (cfindi:sr q p.i.l .n) (cfindi:sr q q.i.l .n)) + == + $(l t.l, snippet (cat 3 snippet r)) + +:: ++ search2 +:: |= [q=@t p=post:tp] ^- ? +:: ?~ contents.p .n +:: =/ latest=content-list:tp val:head:(pop:corm:tp contents.p) +:: =/ in-tags %+ roll ~(tap in tags.p) |= [i=cord a=_|] +:: ?: (cfind:sr q i .n) %& a +:: =/ in-blocks %+ roll latest |= [i=block:tp a=_|] +:: ?: ?- -.i +:: %paragraph (in-inline2 p.i q) +:: %blockquote (in-block p.i q) +:: %list (in-inline2 p.i q) +:: %heading (cfind:sr q p.i .n) +:: %codeblock (cfind:sr q code.i .n) +:: %eval (cfind:sr q hoon.i .n) +:: %json (cfind:sr q content.i .n) +:: %media (in-media2 media.i q) +:: %ref %| :: TODO +:: %table %| :: TODO +:: %tasklist .n +:: == %& a +:: ?| in-tags in-blocks == +++ in-media2 +|= [=media:tp q=@t] ^- ? +?. ?=(%images -.media) (cfind:sr q p.media .n) +%+ roll p.media |= [[url=cord caption=cord] a=_|] +?: (cfind:sr q url .n) %& a +:: ++ in-inline2 +:: |= [l=(list inline:tp) q=@t] ^- ? +:: |- +:: ?~ l .n +:: =/ i i.l +:: =/ r=? +:: ?+ -.i (cfind:sr q p.i .n) +:: %break .n +:: %date .n +:: %note .n +:: %ship (cfind:sr q (scot %p p.i) .n) +:: %link ?|((cfind:sr q href.i .n) (cfind:sr q show.i .n)) +:: %ruby ?|((cfind:sr q p.i .n) (cfind:sr q q.i .n)) +:: == +:: ?| r $(l t.l) == +:: +++ page-cond +|= [id=@da current=@ud r=page-req:tp] ^- ? +=/ need-more (lth current count.r) +?~ newer.r + :: newest not bound + ?~ older.r + :: neither oldest or newest is bound + need-more + :: oldest is bound, newest isn't + ?& need-more (lth id u.older.r) == + :: newest bound + ?~ older.r + :: newest is bound, oldest isn't + ?& need-more (gth id u.newer.r) == + :: both are bound + ?&(need-more (lth id u.older.r) (gth id u.newer.r)) +++ get-post-page +|= [feed=gfeed:tp req=page-req:tp] ^- page:tp +=/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == +=/ l ?. from-bottom (tap:gorm:tp feed) (flop (tap:gorm:tp feed)) +=/ res +%+ roll l +|= [[=pid:tp =post:tp] a=[p=page:tp max=@da min=@da]] +=/ id id.pid +?^ parent.post a +=/ max ?: (gth id max.a) id max.a +=/ min ?: ?|((lth id min.a) .=(min.a *@da)) id min.a +:_ [max min] +=/ condition=? (page-cond id count.p.a req) +?. condition p.a +=/ posts [(node-to-full post feed) p.p.a] +:: +=/ oldest ?~ older.p.a `id + ?: (lth id u.older.p.a) `id older.p.a +=/ newest ?~ newer.p.a `id + ?: (gth id u.newer.p.a) `id newer.p.a +[posts newest oldest +(count.p.a)] +:: TODO arg gotta figure this out +=/ o + ?: .=(older.p.res `min.res) ~ older.p.res + :: ?: (lth count.res count.req) ~ +=/ n ?: .=(newer.p.res `max.res) ~ newer.p.res +=/ poasts ?. from-bottom (flop p.p.res) p.p.res +[poasts n o count.p.res] +:: ++ basic-filter +:: |= [=feed:tp req=page-req:tp filter=$-(post:tp ?)] +:: |= [[=id:tp =post:tp] a=spage:tp] +:: ?. (filter post) a +:: =/ posts [post p.a] +:: =/ oldest ?~ older.a `id +:: ?: (lth id u.older.a) `id older.a +:: [posts newer.r oldest +(count.a)] +:: TODO spage or page... +++ get-filtered-post-page-full +|= [feed=gfeed:tp req=page-req:tp filter=$-(post:tp ?)] ^- page:tp +=/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == +=/ l ?. from-bottom (tap:gorm:tp feed) (flop (tap:gorm:tp feed)) +=/ res +%+ roll l +|= [[=pid:tp =post:tp] a=[p=page:tp max=@da min=@da]] +=/ id id.pid +?. (filter post) a +=/ condition=? (page-cond id count.p.a req) +=/ max ?: (gth id max.a) id max.a +=/ min ?: ?|((lth id min.a) .=(min.a *@da)) id min.a +:_ [max min] +?. condition p.a +=/ posts [(node-to-full post feed) p.p.a] +:: +=/ oldest ?~ older.p.a `id + ?: (lth id u.older.p.a) `id older.p.a +=/ newest ?~ newer.p.a `id + ?: (gth id u.newer.p.a) `id newer.p.a +[posts newest oldest +(count.p.a)] +:: TODO arg gottaa figure this out +=/ o + ?: .=(older.p.res `min.res) ~ older.p.res + :: ?: (lth count.res count.req) ~ +=/ n ?: .=(newer.p.res `max.res) ~ newer.p.res +=/ poasts ?. from-bottom (flop p.p.res) p.p.res +[poasts n o count.p.res] +++ get-filtered-post-page +|= [feed=gfeed:tp req=page-req:tp filter=$-(post:tp ?)] ^- spage:tp + =/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == + =/ l ?. from-bottom (tap:gorm:tp feed) (flop (tap:gorm:tp feed)) + =/ res + %+ roll l + |= [[=pid:tp =post:tp] a=[p=spage:tp max=@da min=@da]] + =/ id id.pid + ?. (filter post) a + =/ condition=? (page-cond id count.p.a req) + =/ max ?: (gth id max.a) id max.a + =/ min ?: ?|((lth id min.a) .=(min.a *@da)) id min.a + :_ [max min] + ?. condition p.a + =/ posts [post p.p.a] + :: + =/ oldest ?~ older.p.a `id + ?: (lth id u.older.p.a) `id older.p.a + =/ newest ?~ newer.p.a `id + ?: (gth id u.newer.p.a) `id newer.p.a + [posts newest oldest +(count.p.a)] + :: TODO arg gottaa figure this out + =/ o + ?: .=(older.p.res `min.res) ~ older.p.res + :: ?: (lth count.res count.req) ~ + =/ n ?: .=(newer.p.res `max.res) ~ newer.p.res + =/ poasts ?. from-bottom (flop p.p.res) p.p.res + [poasts n o count.p.res] + +:: ++ get-tag-page +:: |= [feed=gfeed:tp tt=tags-table l=(list @t) r=page-req:tp] ^- page:tp +:: ~> %bout +:: =/ pids %+ roll l |= [i=@t a=(list pid:tp)] =/ ps (~(get by tt) i) +:: ?~ ps a (weld u.ps a) +:: =/ filter |= =post:tp (~(has in (sy pids)) [author.post id.post]) +:: (get-filtered-post-page-full feed r filter) + +:: ++ pcond +:: |= [id=@da r=page-req:tp] ^- ? +:: ?~ older.r +:: ?~ newer.r .y +:: (gth id u.newer.r) +:: ?~ newer.r +:: (lth id u.older.r) +:: ?& (lth id u.older.r) (gth id u.newer.r) == + +:: ++ get-tag-page-2 +:: |= [feed=gfeed:tp tt=tags-table l=(list @t) r=page-req:tp] ^- page:tp +:: =/ =pid-graph:tp +:: ~> %bout +:: %+ roll l |= [i=@t a=pid-graph:tp] +:: =/ pids-by-tag (~(get by tt) i) +:: ?~ pids-by-tag a =/ pl (flop u.pids-by-tag) +:: |- +:: ?~ pl a +:: ?. (pcond id.i.pl r) $(pl t.pl) +:: %= $ +:: a (put:porm:tp a id.i.pl ship.i.pl) +:: pl t.pl +:: == +:: =/ top (pry:porm:tp pid-graph) +:: =/ tom (ram:porm:tp pid-graph) +:: =/ max ?~ top ~ `-.u.top +:: =/ min ?~ tom ~ `-.u.tom +:: =/ res=page:tp +:: =| =page:tp +:: =/ pids (tap:porm:tp pid-graph) +:: |- +:: ?~ pids page +:: =/ id -.i.pids +:: ?: .=(count.page count.r) page +:: ?. (pcond id r) $(pids t.pids) +:: =/ post (get:gorm:tp feed [+.i.pids id]) +:: ?~ post $(pids t.pids) +:: =/ np=page:tp +:: =/ posts [(node-to-full u.post feed) p.page] +:: =/ oldest ?~ older.page `id +:: ?: (lth id u.older.page) `id older.page +:: =/ newest ?~ newer.page `id +:: ?: (gth id u.newer.page) `id newer.page +:: [posts newest oldest +(count.page)] +:: %= $ +:: page np +:: pids t.pids +:: == +:: =/ n ?: .=(max newer.res) ~ newer.res +:: =/ o ?: .=(min older.res) ~ older.res +:: res(newer n, older o, p (flop p.res)) + +:: ++ get-tag-page-3 +:: |= [feed=gfeed:tp tt=tags-table l=(list @t) r=page-req:tp] ^- page:tp +:: ~> %bout +:: =/ empty *page:tp +:: =| count=@ud +:: =/ posts=(list full-node:tp) +:: |- ^- (list full-node:tp) +:: ?~ l ~ +:: =/ pids (~(get by tt) i.l) +:: ?~ pids ~ +:: =/ pl (flop u.pids) +:: %+ welp ^- (list full-node:tp) +:: |- +:: ?~ pl ~ +:: ?: (gte count count.r) ~ +:: ?. (pcond +.i.pl r) $(pl t.pl) +:: =/ poast (get:gorm:tp feed i.pl) +:: ?~ poast $(pl t.pl) +:: =/ fn (node-to-full u.poast feed) +:: :- fn +:: $(pl t.pl, count +(count)) +:: $(l t.l) +:: :: +:: =/ newer ~ +:: =/ older ?~ posts ~ (some id:p:(rear posts)) +:: [posts newer older (lent posts)] + +++ tag-search + |= l=(list @t) + |= =post:tp ^- ? + |- + ?~ l .n + =/ ok=? ?& (~(has in tags.post) (crip (cass (trip i.l)))) ?=(%~ parent.post) == + ?: ok .y + $(l t.l) + +++ tag-search-old +|= [l=(list @t) feed=gfeed:tp r=page-req:tp] ^- page:tp + %+ roll (tap:gorm:tp feed) |= [[=pid:tp =post:tp] a=page:tp] + =/ id id.pid + =/ condition (page-cond id count.a r) + ?. condition a + =/ found + =/ has .y + |- + ?~ l has + ?& has + =/ ns (~(has in tags.post) (crip (cass (trip i.l)))) + $(l t.l, has ns) + == + =/ posts ?. found p.a :_ p.a + (node-to-full post feed) + =/ oldest ?~ older.a `id + ?: (lth id u.older.a) `id older.a + =/ count ?: .=(count.a count.r) count.r +(count.a) + [posts newer.r oldest count] +:: +++ search-filter-full +|= [feed=gfeed:tp req=page-req:tp filter=$-(post:tp ?)] ^- page:tp +=/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == +=/ l ?. from-bottom (tap:gorm:tp feed) (flop (tap:gorm:tp feed)) +=/ res +%+ roll l +|= [[=pid:tp =post:tp] a=[p=page:tp max=@da min=@da]] +=/ id id.pid +?. (filter post) a +=/ condition=? (page-cond id count.p.a req) +=/ max ?: (gth id max.a) id max.a +=/ min ?: ?|((lth id min.a) .=(min.a *@da)) id min.a +:_ [max min] +?. condition p.a +=/ posts [(node-to-full post feed) p.p.a] +:: +=/ oldest ?~ older.p.a `id + ?: (lth id u.older.p.a) `id older.p.a +=/ newest ?~ newer.p.a `id + ?: (gth id u.newer.p.a) `id newer.p.a +[posts newest oldest +(count.p.a)] +=/ o + ?: .=(older.p.res `min.res) ~ older.p.res + :: ?: (lth count.res count.req) ~ +=/ n ?: .=(newer.p.res `max.res) ~ newer.p.res +=/ poasts ?. from-bottom (flop p.p.res) p.p.res +[poasts n o count.p.res] + +++ search-filter +|= [feed=gfeed:tp req=page-req:tp filter=$-(post:tp ?)] ^- spage:tp +=/ from-bottom=? ?& ?=(%~ older.req) ?!(?=(%~ newer.req)) == +=/ l ?. from-bottom (tap:gorm:tp feed) (flop (tap:gorm:tp feed)) +=/ res +%+ roll l +|= [[=pid:tp =post:tp] a=[p=spage:tp max=@da min=@da]] +=/ id id.pid +?. (filter post) a +=/ condition=? (page-cond id count.p.a req) +=/ max ?: (gth id max.a) id max.a +=/ min ?: ?|((lth id min.a) .=(min.a *@da)) id min.a +:_ [max min] +?. condition p.a +=/ posts [post p.p.a] +:: +=/ oldest ?~ older.p.a `id + ?: (lth id u.older.p.a) `id older.p.a +=/ newest ?~ newer.p.a `id + ?: (gth id u.newer.p.a) `id newer.p.a +[posts newest oldest +(count.p.a)] +=/ o + ?: .=(older.p.res `min.res) ~ older.p.res + :: ?: (lth count.res count.req) ~ +=/ n ?: .=(newer.p.res `max.res) ~ newer.p.res +=/ poasts ?. from-bottom (flop p.p.res) p.p.res +[poasts n o count.p.res] + +:: +++ tlon-scan-to-post + |= s=reference:tlonc ^- post:tp + =/ np *post:tp + ?: ?=(%post -.s) + =/ =memo:tlonc +>-.s + =/ children %- sy %+ turn (tap:on-replies:tlonc replies.+<.s) + |= [id=@da reply:tlonc] [author id] + %= np + id sent.memo + author author.memo + thread [~zod sent.memo] :: TODO mmm + parent ~ + contents (tlon-trill-contents content.memo sent.memo) + children children + == + :: + =/ =memo:tlonc +.reply.s + =/ par parent-id.-.reply.s + %= np + id sent.memo + author author.memo + thread [~zod par] :: TODO really? + parent (some [~zod par]) :: TODO mmm + contents (tlon-trill-contents content.memo sent.memo) + == +++ tlon-trill-contents + |= [l=(list verse:tlonc) =time] ^- content-map:tp + =/ cl=content-list:tp %+ roll l + |= [i=verse:tlonc a=content-list:tp] + ?: ?=(%block -.i) :_ a (tlon-block p.i) + =/ l p.i + =/ nb=content-list:tp *content-list:tp + =/ cl=content-list:tp + |- + ?~ l nb + =/ nnb=content-list:tp + ?: ?=(%task -.i.l) =/ task [(turn q.i.l tlon-inline) p.i.l] + =/ lb (last-block nb %tasklist) + =/ tl=(list task:tp) ?~ lb ~ ?. ?=(%tasklist -.u.lb) ~ p.u.lb + (snoc nb [%tasklist (snoc tl task)]) + ?: ?=(%blockquote -.i.l) + (snoc nb [%blockquote (turn p.i.l tlon-inline)]) + ?: ?=(%code -.i.l) + (snoc nb [%codeblock p.i.l '']) + ?: ?=(%block -.i.l) + (snoc nb [%ref %channels ~zod /]) :: TODO lol + :: + =/ bun=(list inline:tp) ~ + =/ f (flop nb) + =/ inlines ?~ f bun + =/ first=block:tp -.f + ?. ?=(%paragraph -.first) bun p.first + %+ snoc nb :- %paragraph + %+ snoc inlines + ?- -.i.l + %italics [%italic (crip (flatten-tlon-inline p.i.l))] + %bold [%bold (crip (flatten-tlon-inline p.i.l))] + %strike [%strike (crip (flatten-tlon-inline p.i.l))] + %inline-code [%codespan p.i.l] + %ship [%ship p.i.l] + %tag [%text p.i.l] + %link [%link p.i.l q.i.l] + %break [%break ~] + == + $(l t.l, nb nnb) + (weld cl a) + + =/ g=(list [@da content-list:tp]) :~([time (flop cl)]) + %+ gas:corm:tp *content-map:tp g + +:: +++ last-block +|= [l=content-list:tp tag=$?(%paragraph %tasklist)] ^- (unit block:tp) +=/ f (flop l) +|- +?~ f ~ +?: .=(tag -.i.f) (some i.f) $(f t.f) +++ tlon-block +|= b=block:tlonc ^- block:tp +?- -.b +%image [%media %images ~[[src.b alt.b]]] +%cite (tlon-cite +.b) +%header [%heading (crip (flatten-tlon-inline q.b)) p.b] +%listing (tlon-listing p.b) +%rule [%paragraph ~] +%code [%codeblock code.b lang.b] +== +++ tlon-listing +|= l=listing:tlonc ^- block:tp +?. ?=(%list -.l) [%paragraph (turn p.l tlon-inline)] +:: + ?: ?=(%tasklist p.l) :- %tasklist ~ :: TODO wtf is this%+ roll q.l :: TODO idgi what r does in this type + :- %list :_ ?=(%ordered p.l) ~ :: TODO i'm tired + :: :_ ~ :_ ~ %+ roll q.l tlon-listing + +++ tlon-inline +|= i=inline:tlonc ^- inline:tp +?@ i [%text i] +?- -.i +%italics [%italic (crip (flatten-tlon-inline p.i))] +%bold [%bold (crip (flatten-tlon-inline p.i))] +%strike [%strike (crip (flatten-tlon-inline p.i))] +%blockquote [%text (crip (weld "> " (flatten-tlon-inline p.i)))] +%inline-code [%codespan p.i] +%code [%codespan p.i] +%ship [%ship p.i] +%block [%break ~]:: [%ref %channels ~zod /] +%tag [%text p.i] +%link [%link p.i q.i] +%task [%text ''] +%break [%break ~] +== +++ flatten-tlon-inline +|= l=(list inline:tlonc) ^- tape +%+ roll l |= [i=inline:tlonc a=tape] +=/ res +?@ i (trip i) +?- -.i +%italics (flatten-tlon-inline p.i) +%bold (flatten-tlon-inline p.i) +%strike (flatten-tlon-inline p.i) +%blockquote (flatten-tlon-inline p.i) +%inline-code (trip p.i) +%code (trip p.i) +%ship (scow %p p.i) +%block (trip q.i) +%tag (trip p.i) +%link (trip p.i) +%task (flatten-tlon-inline q.i) +%break "" +== +" {a} {res}" +++ tlon-cite +|= c=cite:tlonc +:- %ref +?- -.c +%chan [%channels p.q.nest.c wer.c] :: TODO is this path ok? nah needs type of channel and whatever +%group [%groups p.flag.c /[q.flag.c]] +%desk [%app p.flag.c wer.c] :: TODO same +%bait [%groups p.grp.c wer.c] :: TODO same +== +:: ++ add-tag-lookup +:: |= [lt=(list @t) =pid:tp table=tags-table] ^- tags-table +:: %^ fold:sr lt table |= [tag=@t a=tags-table] +:: =/ cur (~(get by a) tag) +:: =/ nl ?~ cur +:: =/ bnt *threads +:: (put:torm:tp bnt pid ) +:: ~[pid] [pid u.cur] +:: (~(put by a) tag nl) + +-- diff --git a/desk/lib/twatter.hoon b/desk/lib/twatter.hoon new file mode 100644 index 0000000..3410c0d --- /dev/null +++ b/desk/lib/twatter.hoon @@ -0,0 +1,511 @@ +/- spider +/+ strandio,sr=sortug, server +=, strand=strand:spider +=, strand-fail=strand-fail:libstrand:spider +|% ++$ kv [k=@t v=@t] ++$ param [k=@t v=json] +:: check nitter/src/consts.nim +++ auth-key :: nitters +'Bearer AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF' +++ api-key +'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA' +++ api-key2 +'Bearer AAAAAAAAAAAAAAAAAAAAAIWCCAAAAAAA2C25AxqI%2BYCS7pdfJKRH8Xh19zA%3D8vpDZzPHaEJhd20MKVWp3UR38YoPpuTX7UD2cVYo3YNikubuxd' +:: iphone +++ api-key-3 +'Bearer AAAAAAAAAAAAAAAAAAAAAAj4AQAAAAAAPraK64zCZ9CSzdLesbE7LB%2Bw4uE%3DVJQREvQNCZJNiz3rHO7lOXlkVOQkzzdsgu6wWgcazdMUaGoUGm' +:: ipad -- TimelineSearch returns data in a different format, making nitter return empty results. on the other hand, it has high rate limits. build separate token pools per endpoint? +++ api-key-4 +'Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR' +++ base-url +"https://api.twitter.com/" +++ graphql +(weld base-url "graphql/") +++ burl +|= [query-id=tape path=tape] ^- tape +"{graphql}{query-id}/{path}" +++ urls + |% + ++ tweet-lurk + [query-id="mbnjGF4gOwo5gyp9pe5s4A" path="TweetResultByRestId"] + :: logged gets + ++ user-by-id + [query-id="oPppcargziU1uDQHAUmH-A" path="UserResultByIdQuery"] + ++ user-tweets + [query-id="VgitpdpNZ-RUIp5D1Z_D-A" path="UserTweets"] + ++ user-by-name + [query-id="G3KGOASz96M-Qu0nwmGXNg" path="UserByScreenName"] + ++ user-replies + [query-id="8IS8MaO-2EN6GZZZb8jF0g" path="UserWithProfileTweetsAndRepliesQueryV2"] + ++ user-media + [query-id="PDfFf8hGeJvUCiTyWtw4wQ" path="MediaTimelineV2"] + ++ conversation + [query-id="83h5UyHZ9wEKBVzALX8R_g" path="ConversationTimelineV2"] + ++ tweet-result + [query-id="sITyJdhRPpvpEjg4waUmTA" path="TweetResultByIdQuery"] + ++ list-by-id + [query-id="iTpgCtbdxrsJfyx0cFjHqg" path="ListByRestId"] + ++ list-by-slug + [query-id="-kmqNvm5Y-cVrfvBy6docg" path="ListBySlug"] + ++ list-members + [query-id="P4NpVZDqUD_7MEM84L-8nw" path="ListMembers"] + ++ list-timeline + [query-id="BbGLL1ZfMibdFNWlk7a0Pw" path="ListTimeline"] + ++ tweet-detail + [query-id="BbmLpxKh8rX8LNe2LhVujA" path="TweetDetail"] + ++ search-timeline + [query-id="lZ0GCEojmtQfiUQa5oJSEw" path="SearchTimeline"] + :: POST URLs + ++ create-tweet + [query-id="5V_dkq1jfalfiFOEZ4g47A" path="CreateTweet"] + ++ create-retweet + [query-id="ojPdsZsimiJrUGLR1sjUtA" path="CreateRetweet"] + ++ favorite-tweet + [query-id="lI07N6Otwv1PhnEgXILM7A" path="FavoriteTweet"] + ++ delete-tweet + [query-id="VaenaVgh5q5ih7kvyVjgtg" path="DeleteTweet"] + -- +:: shit this is legacy +++ notifications-url "https://twitter.com/i/api/2/notifications/all.json" +++ base-variables +^- (list param) +:~ +['includePromotedContent' b+%|] +['withHighlightedLabel' b+%|] +['withCommunity' b+%|] +['with_rux_injections' b+%|] +['referrer' s+'tweet'] +['withTweetQuoteCount' b+%&] +['withBirdwatchNotes' b+%|] +['withBirdwatchPivots' b+%|] +['withTweetResult' b+%&] +['withReactions' b+%&] +['withReactionsMetadata' b+%|] +['withReactionsPerspective' b+%|] +['withSuperFollowsTweetFields' b+%|] +['withSuperFollowsUserFields' b+%|] +['withUserResults' b+%|] +['withVoice' b+%&] +['withV2Timeline' b+%&] +:: +['withQuickPromoteEligibilityTweetFields' b+%|] +== +++ build-variables +|= l=(list param) ^- tape +%- uri-encode:sr +%- trip +%- en:json:html %- pairs:enjs:format +(weld base-variables l) +++ features-2 +^- tape +%- uri-encode:sr +%- trip +%- en:json:html %- pairs:enjs:format +:~ +['android_graphql_skip_api_media_color_palette' b+.n] +['blue_business_profile_image_shape_enabled' b+.n] +['creator_subscriptions_subscription_count_enabled' b+.n] +['creator_subscriptions_tweet_preview_api_enabled' b+.y] +['freedom_of_speech_not_reach_fetch_enabled' b+.n] +['graphql_is_translatable_rweb_tweet_is_translatable_enabled' b+.n] +['hidden_profile_likes_enabled' b+.n] +['highlights_tweets_tab_ui_enabled' b+.n] +['interactive_text_enabled' b+.n] +['longform_notetweets_consumption_enabled' b+.y] +['longform_notetweets_inline_media_enabled' b+.n] +['longform_notetweets_richtext_consumption_enabled' b+.y] +['longform_notetweets_rich_text_read_enabled' b+.n] +['responsive_web_edit_tweet_api_enabled' b+.n] +['responsive_web_home_pinned_timelines_enabled' b+.n] +['responsive_web_enhance_cards_enabled' b+.n] +['responsive_web_graphql_exclude_directive_enabled' b+.y] +['responsive_web_graphql_skip_user_profile_image_extensions_enabled' b+.n] +['responsive_web_graphql_timeline_navigation_enabled' b+.n] +['responsive_web_media_download_video_enabled' b+.n] +['responsive_web_text_conversations_enabled' b+.n] +['responsive_web_twitter_article_tweet_consumption_enabled' b+.n] +['responsive_web_twitter_blue_verified_badge_is_enabled' b+.y] +['rweb_lists_timeline_redesign_enabled' b+.y] +['spaces_2022_h2_clipping' b+.y] +['spaces_2022_h2_spaces_communities' b+.y] +['standardized_nudges_misinfo' b+.n] +['subscriptions_verification_info_enabled' b+.y] +['subscriptions_verification_info_reason_enabled' b+.y] +['subscriptions_verification_info_verified_since_enabled' b+.y] +['super_follow_badge_privacy_enabled' b+.n] +['super_follow_exclusive_tweet_notifications_enabled' b+.n] +['super_follow_tweet_api_enabled' b+.n] +['super_follow_user_api_enabled' b+.n] +['tweet_awards_web_tipping_enabled' b+.n] +['tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled' b+.n] +['tweetypie_unmention_optimization_enabled' b+.n] +['unified_cards_ad_metadata_container_dynamic_card_content_query_enabled' b+.n] +['verified_phone_label_enabled' b+.n] +['vibe_api_enabled' b+.n] +['view_counts_everywhere_api_enabled' b+.n] +== +++ post-features ^- (list [@t json]) +:~ ['c9s_tweet_anatomy_moderator_badge_enabled' b+.y] + ['freedom_of_speech_not_reach_fetch_enabled' b+.y] + ['graphql_is_translatable_rweb_tweet_is_translatable_enabled' b+.y] + ['longform_notetweets_consumption_enabled' b+.y] + ['longform_notetweets_inline_media_enabled' b+.y] + ['longform_notetweets_rich_text_read_enabled' b+.y] + ['responsive_web_edit_tweet_api_enabled' b+.y] + ['responsive_web_enhance_cards_enabled' b+.n] + ['responsive_web_graphql_exclude_directive_enabled' b+.y] + ['responsive_web_graphql_skip_user_profile_image_extensions_enabled' b+.n] + ['responsive_web_graphql_timeline_navigation_enabled' b+.y] + ['responsive_web_home_pinned_timelines_enabled' b+.y] + ['responsive_web_media_download_video_enabled' b+.n] + ['responsive_web_twitter_article_tweet_consumption_enabled' b+.n] + ['standardized_nudges_misinfo' b+.y] + ['tweet_awards_web_tipping_enabled' b+.n] + ['tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled' b+.y] + ['tweetypie_unmention_optimization_enabled' b+.y] + ['verified_phone_label_enabled' b+.n] + ['view_counts_everywhere_api_enabled' b+.y] +== +++ features +^- tape +%- uri-encode:sr +%- trip +%- en:json:html %- pairs:enjs:format +:~ +['creator_subscriptions_tweet_preview_api_enabled' b+%&] +['freedom_of_speech_not_reach_fetch_enabled' b+%|] +['graphql_is_translatable_rweb_tweet_is_translatable_enabled' b+%&] +['interactive_text_enabled' b+%&] +['longform_notetweets_consumption_enabled' b+%&] +['longform_notetweets_inline_media_enabled' b+%&] +['longform_notetweets_rich_text_read_enabled' b+%|] +['longform_notetweets_richtext_consumption_enabled' b+%|] +['responsive_web_edit_tweet_api_enabled' b+%&] +['responsive_web_enhance_cards_enabled' b+%|] +['responsive_web_home_pinned_timelines_enabled' b+.n] +['responsive_web_graphql_exclude_directive_enabled' b+%&] +['responsive_web_graphql_timeline_navigation_enabled' b+%&] +['responsive_web_graphql_skip_user_profile_image_extensions_enabled' b+%|] +['responsive_web_media_download_video_enabled' b+%&] +['responsive_web_text_conversations_enabled' b+%|] +['responsive_web_twitter_blue_verified_badge_is_enabled' b+%&] +['responsive_web_twitter_article_tweet_consumption_enabled' b+%&] +['rweb_lists_timeline_redesign_enabled' b+%&] +['standardized_nudges_misinfo' b+%&] +['tweet_awards_web_tipping_enabled' b+%|] +['tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled' b+%|] +['tweetypie_unmention_optimization_enabled' b+%&] +['verified_phone_label_enabled' b+%|] +['vibe_api_enabled' b+%&] +['view_counts_everywhere_api_enabled' b+%&] +:: +['android_graphql_skip_api_media_color_palette' b+.y] +['super_follow_badge_privacy_enabled' b+.y] +['super_follow_tweet_api_enabled' b+.y] +['subscriptions_verification_info_enabled' b+.y] +['blue_business_profile_image_shape_enabled' b+.n] +['super_follow_user_api_enabled' b+.y] +['creator_subscriptions_subscription_count_enabled' b+.y] +['super_follow_exclusive_tweet_notifications_enabled' b+.y] +['unified_cards_ad_metadata_container_dynamic_card_content_query_enabled' b+.y] +:: logged +['c9s_tweet_anatomy_moderator_badge_enabled' b+.n] +:: logged profile +['hidden_profile_likes_enabled' b+.n] +['subscriptions_verification_info_verified_since_enabled' b+.n] +['highlights_tweets_tab_ui_enabled' b+.n] +['subscriptions_verification_info_is_identity_verified_enabled' b+.n] +['hidden_profile_subscriptions_enabled' b+.n] +== +++ userid-params +|= id=@t ^- tape +=/ vrs (build-variables ~[['userId' %s id] ['count' %n '20']]) +"?variables={vrs}&features={features}" +++ post-params +|= id=@t ^- tape +=/ vrs (build-variables ~[['tweetId' %s id]]) +"?variables={vrs}&features={features}" +++ user-params +|= id=@t ^- tape +=/ vrs (build-variables ~[['screen_name' %s id]]) +"?variables={vrs}&features={features-2}" +++ user-tweets-params +|= id=@t ^- tape +=/ vrs (build-variables ~[['rest_id' %s id] ['count' %n '100']]) +"?variables={vrs}&features={features-2}" +++ legacy-params ^- (list kv) +:~ ['include_profile_interstitial_type' '1'] + ['include_blocking' '1'] + ['include_blocked_by' '1'] + ['include_followed_by' '1'] + ['include_want_retweets' '1'] + ['include_mute_edge' '1'] + ['include_can_dm' '1'] + ['include_can_media_tag' '1'] + ['include_ext_has_nft_avatar' '1'] + ['include_ext_is_blue_verified' '1'] + ['include_ext_verified_type' '1'] + ['skip_status' '1'] + ['cards_platform' 'Web-12'] + ['include_cards' '1'] + ['include_ext_alt_text' 'true'] + ['include_ext_limited_action_results' 'false'] + ['include_quote_count' 'true'] + ['include_reply_count' '1'] + ['tweet_mode' 'extended'] + ['include_ext_collab_control' 'true'] + ['include_ext_views' 'true'] + ['include_entities' 'true'] + ['include_ext_media_color' 'true'] + ['include_ext_media_availability' 'true'] + ['include_ext_sensitive_media_warning' 'true'] + ['include_ext_trusted_friends_metadata' 'true'] + ['send_error_codes' 'true'] + ['simple_quoted_tweet' 'true'] + ['include_ext_edit_control' 'true'] + ['ext' 'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe'] +== +++ params-to-tape +|= l=(list kv) ^- tape +%+ roll l +|= [i=[k=@t v=@t] a=tape] +=/ key (trip k.i) +=/ val (trip v.i) +?~ a "{a}key={val}" +"{a}&{key}={val}" +++ notes-params +%- params-to-tape +%+ weld legacy-params +:~ ['count' '20'] + ['requestContext' 'launch'] +== +++ search-params +|= [query=@t cursor=@t count=@ type=?(%user %post)] ^- tape +=/ base=(list kv) %+ weld legacy-params +:~ ['q' query] + ['count' (crip "{<count>}")] + ['query_source' 'typeahead_click'] :: 'typed_query + ['cursor' cursor] + ['pc' '1'] + ['spelling_corrections' '1'] + ['include_ext_edit_control' 'true'] + ['ext' 'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe'] +== +=/ full=(list [@t @t]) ?- type + %user (snoc base ['result_filter' 'user']) + %post (snoc base ['tweet_search_mode' 'live']) +== +(params-to-tape full) +:: requests +:: guest-token +++ gt-request +^- request:http +=/ method %'POST' +=/ url 'https://api.twitter.com/1.1/guest/activate.json' +=/ headers +:~ +['connection' 'keep-alive'] +['authorization' auth-key] +['content-type' 'application/x-www-form-urlffencoded'] +['x-twitter-active-user' 'yes'] +['x-twitter-client-language' 'en-us'] +['Accept-language' 'en-US,en;q=0.9'] +['Accept' '*/*'] +['origin' 'https://twitter.com'] +['referer' 'https://twitter.com/'] +['DNT' '1'] +['User-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'] +== +[method url headers ~] +++ parse-gt +|= res=client-response:iris +=/ m (strand ,cord) +^- form:m +?. ?=(%finished -.res) (strand-fail:strand %no-body ~) +?~ full-file.res (strand-fail:strand %no-body ~) +=/ body=@t q.data.u.full-file.res +=/ jon=(unit json) (de:json:html body) +?~ jon (strand-fail:strand %no-body ~) +(pure:m (parse-gt-json u.jon)) +++ parse-gt-json + |= =json + ^- @t + =/ mapi ((om so):dejs:format json) + (~(got by mapi) 'guest_token') +::: csrf +++ csrf-token-request +^- request:http +=/ method %'GET' +=/ url 'https://developer.twitter.com/en' +=/ headers +:~ +['connection' 'keep-alive'] +['content-type' 'application/x-www-form-urlffencoded'] +['x-twitter-active-user' 'yes'] +['x-twitter-client-language' 'en-us'] +['Accept-language' 'en-US,en;q=0.9'] +['Accept' '*/*'] +['origin' 'https://twitter.com'] +['referer' 'https://twitter.com/'] +['DNT' '1'] +['User-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'] +== +[method url headers ~] +++ parse-csrf +|= res=client-response:iris +=/ m (strand ,cord) +^- form:m +?. ?=(%finished -.res) (strand-fail:strand %no-body ~) +=+ %+ skim headers.response-header.res +|= pair=[key=@t value=@t] .=(key.pair 'set-cookie') +=/ cookies=(list @t) %+ turn - +|= pair=[key=@t value=@t] value.pair :: parse this a bit +=/ csrf (extract-csrf cookies) +(pure:m csrf) +++ extract-csrf +|= cookies=(list @t) ^- @t +%+ roll cookies +|= [item=@t acc=@t] +?. (contains:string:sr (trip item) "ct0=") acc +=+ (split:string:sr (trip item) ";") +=+ (split:string:sr (snag 0 -) "=") +(crip (snag 1 -)) +:: ++ embed-request +:: |= id=@t +:: =/ endpoint %- crip "{embed-url:endpoints}{(trip id)}" +:: =/ method %'GET' +:: =/ headers +:: :~ +:: ['connection' 'keep-alive'] +:: ['Accept-language' 'en-US,en;q=0.9'] +:: ['Accept' '*/*'] +:: ['origin' 'https://platform.twitter.com'] +:: ['referer' 'https://platform.twitter.com/'] +:: ['DNT' '1'] +:: ['User-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'] +:: == +:: [method endpoint headers ~] +++ twatter-request +|= [endpoint=@t gt=@t csrf=@t] +^- request:http +=/ method %'GET' +=/ headers +:~ + ['connection' 'keep-alive'] + ['authorization' auth-key] + ['content-type' 'application/json'] + ['x-csrf-token' csrf] + ['x-guest-token' gt] + ['x-twitter-active-user' 'yes'] + ['x-twitter-client-language' 'en-us'] + ['Accept-language' 'en-US,en;q=0.9'] + ['Accept' '*/*'] + ['origin' 'https://twitter.com'] + ['referer' 'https://twitter.com/'] + ['DNT' '1'] + ['User-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'] + :: ['authority' 'api.twitter.com'] +== +[method endpoint headers ~] +:: ++ build-request-url +:: |= [endpoint=tape l=(list kv)] ^- @t +:: =/ vars (uri-encode:u (build-variables l)) +:: =+ (weld base-url:endpoints endpoint) +:: =+ (weld - vars) +:: (crip -) +:: ++ build-request-v2-url +:: |= [key=@t query=@t cursor=@t endpoint=tape] ^- @t +:: =/ vars (uri-encode:u (build-variables key query cursor)) +:: =/ feat (uri-encode:u features) +:: =+ (weld base-url:endpoiunts endpoint) +:: =+ (weld - vars) +:: =+ (weld - "&features={feat}") +:: (crip -) +:: ++ build-search-url +:: |= [query=@t cursor=@t] :: TODO count and replies +:: :: " include:nativeretweets", " include:replies" +:: =/ q "{<query>} include:nativeretweets exclude:replies" +:: :: =/ q "{<query>} include:nativeretweets include:replies" +:: =/ qq %- en-urlt:html (en-urlt:html q) +:: =/ c %- en-urlt:html (en-urlt:html (trip cursor)) +:: :: =/ c (en-urlt:html (trip cursor)) +:: :: =/ c (trip cursor) +:: =+ +:: "include_profile_interstitial_type=1&cursor={c}&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&cards_platform=Web-12&include_cards=1&include_ext_alt_text=true&include_quote_count=true&include_reply_count=1&tweet_mode=extended&include_entities=true&include_user_entities=true&include_ext_media_color=true&include_ext_media_availability=true&include_ext_sensitive_media_warning=true&send_error_codes=true&simple_quoted_tweet=true&tweet_search_mode=live&q={qq}&count=20&query_source=typed_query&pc=1&spelling_corrections=1&ext=mediaStats%2ChighlightedLabel%2ChasNftAvatar%2CvoiceInfo%2CsuperFollowMetadata" +:: =+ (weld search:endpoints (search-params query cursor 20 %post)) +:: =+ (weld base-url:endpoints -) +:: (crip -) :: =/ url %- crip (weld tweet-lurk (post-params id.u.command)) + :: =/ req (twatter-request url gt csrf) +++ lurk-headers +:~ + ['Connection' 'keep-alive'] + ['Content-type' 'application/json'] + ['X-twitter-active-user' 'yes'] + ['X-twitter-client-language' 'en-us'] + ::['x-guest-token' gt] + ['Accept-language' 'en-US,en;q=0.9'] + ['Accept' '*/*'] + ['origin' 'https://twitter.com'] + ['referer' 'https://twitter.com/'] + ['DNT' '1'] + ['User-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'] +== +++ logged-headers +|= [cookie-string=@t csrf=@t] +:: =/ cookie-string +:: 'guest_id=v1%3A169380915299959910; guest_id_ads=v1%3A169380915299959910; guest_id_marketing=v1%3A169380915299959910; kdt=VZeo5b3hVg9VsnQjJYiUsFLNvQIa1lqnxry4dcXK; auth_token=88ab0ccf40bb6be863354720d504895c7308e647; ct0=9469495056e099284acb28c9889422b02285c3883e8c9e681c287c2b1287e2e4a8d0ed3dff9a1db4ef05152d2d3f9a891031804a5fc80ef0d8b0ab251067558eec751d8241f617517a47f12a5c0b1ba8; twid=u%3D1633158398555353096; lang=en; external_referer=8e8t2xd8A2w%3D|0|F8C7rVpldvGNltGxuH%2ByoRY%2FzjrflHIZH061f%2B5OiIwP17ZTz34ZGg%3D%3D; personalization_id="v1_kxI2MM4RPdOgambYqR1tUA=="' +:: =/ csrf '9469495056e099284acb28c9889422b02285c3883e8c9e681c287c2b1287e2e4a8d0ed3dff9a1db4ef05152d2d3f9a891031804a5fc80ef0d8b0ab251067558eec751d8241f617517a47f12a5c0b1ba8' +:~ ['Cookie' cookie-string] + ['Connection' 'keep-alive'] + ['Authorization' api-key] + ['Content-type' 'application/json'] + ['X-csrf-token' csrf] + ['X-twitter-active-user' 'yes'] + ['X-twitter-auth-type' 'OAuth2Session'] + ['X-twitter-client-language' 'en-us'] + ['Accept-language' 'en-US,en;q=0.9'] + ['Accept' '*/*'] + ['origin' 'https://twitter.com'] + ['referer' 'https://twitter.com/'] + ['DNT' '1'] + ['User-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'] + :: ['authority' 'api.twitter.com'] +== +:: ++ build-post-body +:: |= p=post-req:tw ^- octs +:: =, enjs:format +:: %- json-to-octs:server +:: %- pairs %- limo +:: :~ [%features (pairs post-features)] +:: ['queryId' s+(crip query-id:create-tweet:urls)] +:: ['variables' (pairs (build-post-vars p))] +:: == +:: ++ build-post-vars +:: |= p=post-req:tw +:: =, enjs:format +:: =/ text=@t ?. mask.p text.p +:: :: TODO automated masking +:: 'This tweet is too spicy for Elon Musk\'s friends. To read it click on the link at my bio' +:: =/ base-vars +:: :~ ['dark_request' b+.n] +:: ['semantic_annotation_ids' a+~] +:: ['tweet_text' s+text] +:: :- 'media' %- pairs +:: :~ ['possibly_sensitive' b+.n] +:: ['media_entities' a+~] +:: == +:: == +:: ?^ quoting.p :_ base-vars :- 'attachment_url' s+u.quoting.p +:: ?^ replying.p :_ base-vars :- 'reply' %- pairs +:: :~ ['exclude_reply_user_ids' a+~] +:: ['in_reply_to_twitter_id' s+u.replying.p] +:: == +:: base-vars +:: ++ logged-req ^- request:http +:: =/ url %- crip (weld user-tweets (userid-params '1633158398555353096')) +:: [%'GET' url logged-headers ~] +:: :: {"userId":"1633158398555353096","count":20,"includePromotedContent":true,"withQuickPromoteEligibilityTweetFields":true,"withVoice":true,"withV2Timeline":true} +:: {"responsive_web_graphql_exclude_directive_enabled":true,"verified_phone_label_enabled":false,"responsive_web_home_pinned_timelines_enabled":true,"creator_subscriptions_tweet_preview_api_enabled":true,"responsive_web_graphql_timeline_navigation_enabled":true,"responsive_web_graphql_skip_user_profile_image_extensions_enabled":false,"c9s_tweet_anatomy_moderator_badge_enabled":true,"tweetypie_unmention_optimization_enabled":true,"responsive_web_edit_tweet_api_enabled":true,"graphql_is_translatable_rweb_tweet_is_translatable_enabled":true,"view_counts_everywhere_api_enabled":true,"longform_notetweets_consumption_enabled":true,"responsive_web_twitter_article_tweet_consumption_enabled":false,"tweet_awards_web_tipping_enabled":false,"freedom_of_speech_not_reach_fetch_enabled":true,"standardized_nudges_misinfo":true,"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":true,"longform_notetweets_rich_text_read_enabled":true,"longform_notetweets_inline_media_enabled":true,"responsive_web_media_download_video_enabled":false,"responsive_web_enhance_cards_enabled":false} + +-- diff --git a/desk/lib/wall.hoon b/desk/lib/wall.hoon new file mode 100644 index 0000000..1ecb879 --- /dev/null +++ b/desk/lib/wall.hoon @@ -0,0 +1,156 @@ +/- b=boke +/+ const=constants +|_ him=@p + +++ tags +|= in=(list @t) ^- (list @t) + %+ skim in tag-filter +++ tag-map +|= tt=tags-table:b ^- tags-table:b + =/ tag-list ~(tap by tt) + %- malt + %+ skim tag-list |= [t=@t *] (tag-filter t) + +++ post-filter +|= tags=(set @t) ^- ? + ?^ (~(int in public-tags) tags) .y + =/ l ~(tap in tags) + |- + ?~ l .y + ?. (tag-filter i.l) .n + $(l t.l) + +++ display-filter +|= t=@t ^- ? +?: .=('blog' t) .n +(tag-filter t) + +++ tag-filter +|= t=@t ^- ? + ?: .=('blog' t) .n + ?: is-admin .y + ?: is-comet (~(has in public-tags) t) + =/ group (~(get by groups) t) + ?~ group .y + (~(has in u.group) him) + + ::?: .=('vip' t) (~(has in subscribers) him) + +:: Where are tags shown +:: 1. Blog postlists +:: 2. Blog post headers +:: 3. Board index +:: 4. Thread index :: actually not yet +:: 5. Thread show, below the main post +:: 6. People can jump in +:: need a list of routes that expose tags +++ public-tags ^- (set @t) +%- silt +:~ 'wyb' + 'public' + 'ngmi' + 'blog' +== +++ boards ^- (set @t) +?: is-comet public-tags +~(key by categories:const) + +++ is-comet ?=(%pawn (clan:title him)) +++ is-admin ^- ? +?| .=(him ~docteg-mothep) + .=((^sein:title him) ~docteg-mothep) +== +++ groups ^- (map @t (set @p)) +|^ + %- malt + :~ :- 'oldtianming' tianming + :- 'ogs' ogs + == + :: + ++ tianming ^- (set @p) + %- silt + :~ ~locpyl-tidnyd + ~torwes-minput + == + ++ ogs ^- (set @p) + %- silt + :~ ~sorwet + ~finnem + ~tiller-tolbus + ~torwes-minput + ~wispem-wantex + ~sogsyt-rammer + ~sivner-figbus + ~simtex-poster + ~libhut-samwes + ~sarlev-sarsen + ~samtyd-lodhet + ~wolrex-sabdun + ~ritpub-sipsyl + ~rignet-bicteg + ~ribben-donnyl + ~ribfel-lodfep + ~radbus-tactyl + ~pathus-hiddyn + ~mopfel-winrux + ~molsur-winnel + ~moddus-sorted + ~midlyx-hatrys + ~millyt-dorsen + ~midsum-salrux + ~micdeg-rinryl + ~master-morzod + ~locpyl-tidnyd + ~hansel-ribbur + ~fonner-batmul + ~fiprys + ~finned-palmer + ~datder-sonnet + ~bidhec-lopwyc + ~mirtyl-wacdec + ~polwex + ~mogtus-sanlux + == +-- +++ subscribers ^- (set @p) +%- silt +:~ ~polwex + ~wolrex-sabdun + ~mogtus-sanlux + ~sollyd-ritnux + ~bidhec-lopwyc +== ++$ substype $?(%base %urbit %full) ++$ subscription + $: started=@da + type=substype + period=$?(%monthly %yearly) + paid=payment + == ++$ payment + $% [%btc amount=@ud address=@t] + [%eth amount=@ud address=@ux] + [%other curr=@tas amount=@ud address=@t] + == ++$ subscription-map (map @p subscription) +++ subs ^- subscription-map + %- malt + :~ :- ~mogtus-sanlux `subscription`[~2024.3.1 %base %yearly %btc 0 ''] + :- ~wolrex-sabdun `subscription`[~2024.3.4 %base %yearly %eth 14 0x0] :: TODO get the currency unit right + :- ~sollyd-ritnux `subscription`[~2024.3.13 %base %yearly %other %sol 0 ''] :: TODO get the currency unit right + :- ~bidhec-lopwyc `subscription`[~2024.3.18 %base %yearly %other %btc 74 ''] :: TODO get the currency unit right + :- ~fiprys `subscription`[~2024.3.24 %full %yearly %other %eth 6 ''] :: TODO get the currency unit right + :- ~molsur-winnel `subscription`[~2024.8.1 %full %yearly %other %eth 6 ''] :: TODO get the currency unit right + :- ~sigmes-modfyn `subscription`[~2024.1.6 %base %yearly %other %usdt 50 ''] :: TODO get the currency unit right +== +++ subscription-type + |= now=@da ^- (unit substype) + ?: is-admin `%full + =/ sub (~(get by subs) him) + ?~ sub ~ + =/ expired %+ gte now + ?: ?=(%yearly period.u.sub) + (add ~d365 started.u.sub) + (add ~d30 started.u.sub) :: TODO use yore for this + ?: expired ~ %- some type.u.sub +-- diff --git a/desk/lib/web2.hoon b/desk/lib/web2.hoon new file mode 100644 index 0000000..6200ebe --- /dev/null +++ b/desk/lib/web2.hoon @@ -0,0 +1,64 @@ +|% ++$ app-creds +$% [%twatter twatter-creds] + [%insta insta-creds] + [%openai p=api-key] + [%neets p=api-key] + [%chatgpt chatgpt-creds] +== ++$ app $?(%twatter %openai %insta %chatgpt %neets) ++$ api-key @t ++$ twatter-creds +$: auth-token=@t + ct0=@t + kdt=@t + twid=@t +== ++$ insta-creds +$: sessionid=@t + ds-user-id=@t + csrftoken=@t +== ++$ chatgpt-creds +$: cookie=@t +== ++$ poke +$% [%add name=@t =app-creds] + [%del name=@t] +== ++$ ui +$% [%scry scry] + [%fact fact] +== ++$ scry +$% [%ng ~] + [%ok p=app-creds] + [%active (set app)] +== ++$ fact +$% [%nothing ~] +== ++$ coki +$: key=@t + value=@t + max-age=@ + expiry=@da + path=@t + domain=@t + secure=_.y + http-only=_.y + samesite=$?(%strict %lax %none) + partitioned=_| +== +++ muh ^- twatter-creds +:* '245a891674d0130f09782cdc0eb3a0e995928305' + 'f2e216c7e1a7fd1e6fab09f6d25b0348c0c70c988ad715bca2307bb0995d3fa8dad5e5b6abbe4a56c13ee168135435e64baeab150e3cab2507a3ddeb28f17aacbc8222a7fed9526952629e4209ddeda2' + 'KDwilxYdu5TZHJbmXLrW1nC4k4CzeqxuKvU9Lcbb' + 'u%3D1710606417324015616' +== +++ twatter-action + $% [%timeline ~] + [%user p=@t] + == + +-- |