diff --git a/Cargo.lock b/Cargo.lock index 9ace22ea..f202c1e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -731,6 +731,7 @@ dependencies = [ name = "rgb-stl" version = "0.11.0-beta.4" dependencies = [ + "amplify", "commit_verify", "rgb-std", "strict_types", diff --git a/RGB21.con b/RGB21.con index 8d5ec5b7..8cbb2d99 100644 --- a/RGB21.con +++ b/RGB21.con @@ -10,18 +10,38 @@ interface RGB21 public inflationAllowance(*): RGB21.ItemsCount public updateRight(?): Rights + error fractionOverflow: 1 + "the amount of fractional token in outputs exceeds 1" + error nonEqualValues: 2 + "the sum of spent token fractions doesn't equal to the sum of token fractions in outputs" + error invalidProof: 3 + "the provided proof is invalid" + error insufficientReserves: 4 + "reserve is insufficient to cover the issued assets" + error issueExceedsAllowance: 6 + "you try to issue more assets than allowed by the contract terms" + error nonFractionalToken: 7 + "attempt to transfer a fraction of non-fractionable token" + error nonEngravableToken: 8 + "attempt to engrave on a token which prohibit engraving" + error invalidAttachmentType: 9 + "attachment has a type which is not allowed for the token" + genesis + errors: fractionOverflow, invalidProof, insufficientReserves, invalidAttachmentType meta: RGBContract.IssueMeta globals: attachmentTypes(*), spec, terms, tokens(*) assigns: assetOwner(*), inflationAllowance(*), updateRight(?) transition engrave: + errors: fractionOverflow, nonEqualValues, nonFractionalToken, nonEngravableToken globals: engravings assigns: assetOwner(+) default: assetOwner inputs: assetOwner(+) transition issue: + errors: fractionOverflow, invalidProof, insufficientReserves, issueExceedsAllowance, invalidAttachmentType meta: RGBContract.IssueMeta globals: attachmentTypes(*), tokens(*) assigns: assetOwner(*), inflationAllowance(*) @@ -29,12 +49,14 @@ interface RGB21 inputs: inflationAllowance(+) transition rename: + errors: globals: spec assigns: updateRight default: updateRight inputs: updateRight transition transfer: required, default + errors: fractionOverflow, nonEqualValues, nonFractionalToken assigns: assetOwner(+) default: assetOwner inputs: assetOwner(+) diff --git a/RGB21@0.1.0.sta b/RGB21@0.1.0.sta new file mode 100644 index 00000000..9cef1ec2 --- /dev/null +++ b/RGB21@0.1.0.sta @@ -0,0 +1,48 @@ +-----BEGIN STRICT TYPE LIB----- +Id: urn:ubideco:stl:9GETUAH3q2Aw4JSiCzGy4Z8bTuagKQvPa4hH4mDxcX9d#type-economy-shannon +Name: RGB21 +Dependency: pvPyTM1N1rG9HEAvvEgqKonnMdakHreYrvGWfFff8q6#atlanta-adrian-sonata +Dependency: DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco +Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy +Checksum-SHA256: facfa1880a6adbd9e1ab28c4f22b8eb03d28f763aa6263b930737ff60497ba0b + +1yV;sGBE=TMyyqiM?p8!jNDm;%M^9TR7RT9MDn!3%{^){AA<1Uo2?YlHei-0Jn$(Q*>nYY!hN5_Bp3Y36tDMM#= +e#tGI($UA5U3KNx<*C>ja}LTPkkZ)t7=2SRCdV{d700{|i8K10Q-T=FR=Q=>S+XY +D&02 +PWpib6c4c!s(W0Hqt(%d1CNN)#sHFQL7%(bMbH%I*cn#*O0A6zlO=)dqLug@gKPz +&##IG7-47St%2#c>Z5R>jkTb_MKDq#SEN33Vr*q#6~N~QWU2Iu=N +;5Y%Jc(U|Lfag@AnPJc|wNxkq=Q~Y;131VRUJ4ZUq7XW +dT-0K2#MqVsrZe&e(V->r|?y|b +&t*2isXxNhAA_oAshzo2`4U{HCV*7Ex=yZ4kc9pbbVOY8BQJvP*estVa^8o+=000 +0002BZK0000001iQPbYWv?ZDnqBRC#b^1_ApG1a4t%WdXM9%>PTDc`{k>OE +FKkW)gskm&GVtw>9hIp4h*F1(Xd%ZDM6)WMyPcWn^h#1_A_hd2nR{3`VR~jz>W^( +~R6%h07Fm$5cj|(?s&L!OcBtF&~2QXC1k>XBYXyYdrZ=H(l+rjwgT#(qgapY9rr) +)NMYY1Y}`!VE_mK06+i$000000096000000000d|Zf9~~c4=;BL}7Gc1_B9TaBys +CWn@%u0c8PJL*z(|^Y;`q0eROY=qU2QOZ-91J16!9Pue$g9S37?ZggdCbO9^cT40 +dFsv{9#8C;FwXAgMWQ~6)qw>p2k8{_|xs$&XCbY*RGLvM9%bOiwb00a$BcWz~5Ms +i_ebZKvH1pxp62nkegYh`XkVRT^z2nA_wWMy~(WdT-0M0t`m1RgOnNH`9#V +S%u3Kb;ndjn$tw`w870iYB3*z@qkyZ2lRWAI?Tm3AJ0J9DT3%h_gCFnv2AW^(~R6%h07Fm$5cj|(?s +&L!OcBtF&~2QP!tef3_vEz605E^ed2G9JfL8W(`-mS*AGV-T+=kv2V`Y*VQFl000 +aU61a5C`WdHyG0R(ezZDjxj0Rjw0tW}OjK{wNk+*yUo6m`c`Mw-(^^0dLtJ!&x@g +7H5qa<{~<8ep?nYaleMc%`0D|O6*W?Fqa%FaDWp@As0ssVVZ*FA( +00035b8l^B00jX7E81FMki)7Y5nvfyjp1hxc-vF?U);Akf4m#x|BW^(~R6%h07Fm$5cj|(?s&L!OcBtF&~ +2QwjbwLPT+#;sbOYcX0EacFqRS{kd{p#WSb|o=g4&w3t@D0VPj}*Wo~qH015yA0R +jw0tW}OjK{wNk+*yUo6m`c`Mw-(^^0dLtJ!&x@g7LN==T}bPg6pYaW?yEmvI#Jj5 ++jh7O(0~OC$;Cubrb*q00000000yK00000000PbWpib6c4cz_1OfmAZf|a700001 +1aog~WdH>M0t`m1RgOnNH`9#VS%u3Kb;ndjn$tw`w870iYB3*z@ea}&I~j%e^ + Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0 +-} + +@context +typelib RGB21 + +import RGBContract#pvPyTM1N1rG9HEAvvEgqKonnMdakHreYrvGWfFff8q6#atlanta-adrian-sonata + use ProofOfReserves#liquid-owner-london + use MimeChar#golf-antonio-courage + use Details#network-kayak-adam + use Name#crystal-visitor-tribune + use MediaType#pixel-venice-grille + use Ticker#mike-atlas-store + use MediaRegName#sulfur-chant-vampire + use Attachment#giraffe-carol-carrot + +import Std#DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco + use AsciiPrintable#diet-oxford-window + use AlphaCapsNum#magnet-section-latin + +import Bitcoin#HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy + use Vout#chrome-robin-gallop + use Txid#cowboy-diego-betty + use Outpoint#dinner-yoga-danube + + +@mnemonic(break-tunnel-gray) +data Allocation : TokenIndex, OwnedFraction + +@mnemonic(source-change-period) +data AttachmentName : [Std.AsciiPrintable#diet-oxford-window ^ 1..0x14] + +@mnemonic(boston-cake-susan) +data AttachmentType : id U8, name AttachmentName + +@mnemonic(castle-dynamic-lemon) +data EmbeddedMedia : type RGBContract.MediaType#pixel-venice-grille, data [Byte] + +@mnemonic(royal-career-axiom) +data EngravingData : appliedTo TokenIndex, content EmbeddedMedia + +@mnemonic(capital-conduct-aspect) +data ItemsCount : U32 + +@mnemonic(vital-edgar-quota) +data OwnedFraction : U64 + +@mnemonic(cinema-gordon-judo) +data TokenData : index TokenIndex + , ticker RGBContract.Ticker#mike-atlas-store? + , name RGBContract.Name#crystal-visitor-tribune? + , details RGBContract.Details#network-kayak-adam? + , preview EmbeddedMedia? + , media RGBContract.Attachment#giraffe-carol-carrot? + , attachments {U8 -> ^ ..0x14 RGBContract.Attachment#giraffe-carol-carrot} + , reserves RGBContract.ProofOfReserves#liquid-owner-london? + +@mnemonic(connect-farmer-havana) +data TokenIndex : U32 + + diff --git a/RGBContract@0.1.0.sta b/RGBContract@0.1.0.sta new file mode 100644 index 00000000..bf3a7bd0 --- /dev/null +++ b/RGBContract@0.1.0.sta @@ -0,0 +1,47 @@ +-----BEGIN STRICT TYPE LIB----- +Id: urn:ubideco:stl:pvPyTM1N1rG9HEAvvEgqKonnMdakHreYrvGWfFff8q6#atlanta-adrian-sonata +Name: RGBContract +Dependency: DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco +Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy +Checksum-SHA256: aad0db48245417d4de015cb78c633d1d049021daddc5bf02d7f67d9acaabba04 + +3sOfyLvL<$a$#e10>K2#MqVsrZe&e(V->r|?y|b&t*2isXxNhAA_oAshyzn}Wc6$ +lVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUP5FX>?<6X>J1mA>% +$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz1Xgc#bfbbo^UK%K(4i9Ajp1M~R@ +C@!4#dQE#lUD;OiKi1Rs>XdX=LbXK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#N1_Q*>kk01IqT4U{HCV*7Ex=yZ4kc9pbbVOY8BQJvP*estVa^A16C +V`*tna%paKVPb4$U=_gU2V|-Aisv2FNXqmBTmS3ZV(<42$azAB_>m7m3_)ygXkkN +PaC1&|Z4UqjL2Yk!Zgd3!000OHL349ubW?C;V+I5UbZKL2WpV+4SFQ*2dy+cL#Wo ++$K-npR=t1{a-C411d)vtBzL}*2ZeeX@0Z)0BZUJ2b#21aJj($Hn^F!mAeRLol5%ecA +&%UCtOO8MBUm^-Yb8}^MRAq8)a|QwgbY*yS0T|1aZxWNw7!I9y+{RnQn@2DI{;m7 +M0k$9KS5Dx9>#1R8UuL +ed2{4utBaoI&AY_{-wdcrn6beCfbYWv?ZDnqB1_A_hd2nR`XC1k>XBYXyYdrZ=H( +l+rjwgT#(qgapY9rr))NMYY24rbxWpi`@2LJ#-AOHwLb#iV^WprT%0SaPua&Ay^Z +*OLE00{vO(i%G%h4}Sf8vn;89aSG|t4s0*&BRFk%a^yrND0jV0000000030{{R30 +00007L}hegX>4-^0RRX90RaF2000000RI300000000~KRb9H4+WprT%0SIzsb7gX +NWpe-t0S?j{I~j%e^V!Z000000RR60000 +0001QoKWNBeiWoJ%dZDj=k00;p*(W0Hqt(%d1CNN)#sHFQL7%(bMbH%I*cn#*O0A +6ze000000000$0000000009O=Vw +}4<9w&x@J^JY|$Mh>NkDF<_PVsv?MWdH;M00eGtZe;)f009JZZ*64&1pxt!d8NV< +z8ivG8NF0~2^zP6U>mmQBm47aRFOswrHLsAV`yP=b7gb@1OfmAZf|a7000011aog +~WdH>M0gQR2!Vw}4<9w&x@J^JY|$Mh>NkDF{tzZDm7fVR8d41Z8 ++*Y#{__VRL9B24rt+Y+-UF17U4&CIoP7b#p5OWMOk?Edyk4bS?yXWpZyY18;6+F# +~jWZ!!gRXmVv`GX!RDb#gQWW@&b1H3M^Lcs2!dWp-t5Hw9&BXJ~Xd1a4_=WjO_7V +RB`3UIuJ$WMOk?UjboZ0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y0cvUiYij{)YyoX; +0d8&qZ*Ku`Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N0eX4_PGN0j1pxpE0>K2 +#MqVsrZe&e(V->r|?y|b&t*2isXxNhAA_oAshzo2`4U{HCV*7Ex=yZ4kc9pbbVOY +8BQJvP*estVa^8o+=0000004M+e0000000~fXWn*b`X>V==6ANi>WNCJ3b7^91Wd +H4q11PWtiZggo)X>4q11qE$sV{&f>3 +1nqsX-#Qka&HF;V`Xl1X-#Qka&HI(Zeeb32?%6mV`)xdZf^<+V`Xl1X-;8oZwmx) +X=85;2xMhrX;5inZw(1!Wo~q7P-$at4h3dqZFFxB31nqsX+~vjbZ-y}V`Xl1X+~v +jbZ-#^VRUqF5)V*vZ*OK#W>RHyWpZ|9a|Qwgb#!=d0`+VYVk7oBr%DNv+($;q`HH +K!gIHa)*%m(-e#9sm3g~J;&0HnY62ZUYgq2{$1_f|(Z* +OJ*2mk;;0000000000|Nj60000005mISmVRB??VQxcjZgg^CV{`=p00;m9000000 +0000|Nj600000022^QdYh`i;0RRXB!34}kUMys8WKDQu6}!mpvbyE1r(Y~+*plEP +2LQK-U=_gU2V|-Aisv2FNXqmBTmS3ZV(<42$azAB_>m7m0RR91000002mk;80000 +0 + +-----END STRICT TYPE LIB----- + diff --git a/RGBContract@0.1.0.stl b/RGBContract@0.1.0.stl new file mode 100644 index 00000000..a6b43d58 Binary files /dev/null and b/RGBContract@0.1.0.stl differ diff --git a/RGBContract@0.1.0.sty b/RGBContract@0.1.0.sty new file mode 100644 index 00000000..887797d3 --- /dev/null +++ b/RGBContract@0.1.0.sty @@ -0,0 +1,91 @@ +{- + Id: urn:ubideco:stl:pvPyTM1N1rG9HEAvvEgqKonnMdakHreYrvGWfFff8q6#atlanta-adrian-sonata + Name: RGBContract + Version: 0.1.0 + Description: Types for writing RGB contracts and interfaces + Author: Dr Maxim Orlovsky + Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0 +-} + +@context +typelib RGBContract + +import Std#DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco + use AsciiPrintable#diet-oxford-window + use AlphaCapsNum#magnet-section-latin + +import Bitcoin#HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy + use Vout#chrome-robin-gallop + use Txid#cowboy-diego-betty + use Outpoint#dinner-yoga-danube + + +@mnemonic(burma-picasso-granite) +data Amount : U64 + +@mnemonic(xray-giant-nina) +data AssetSpec : ticker Ticker + , name Name + , details Details? + , precision Precision + +@mnemonic(flower-anita-austin) +data AssetTerms : text RicardianContract, media Attachment? + +@mnemonic(flame-unicorn-fruit) +data Attachment : type MediaType, digest [Byte ^ 32] + +@mnemonic(gabriel-fiber-oregano) +data BurnMeta : burnProofs {ProofOfReserves} + +@mnemonic(network-kayak-adam) +data Details : [Unicode ^ 1..0xff] + +@mnemonic(alcohol-moral-needle) +data IssueMeta : reserves {ProofOfReserves} + +@mnemonic(memphis-bicycle-roof) +data MediaRegName : [MimeChar ^ 1..0x40] + +@mnemonic(robert-decide-dispute) +data MediaType : type MediaRegName + , subtype MediaRegName? + , charset MediaRegName? + +@mnemonic(golf-antonio-courage) +data MimeChar : excl#33 | hash#35 | dollar | amp#38 + | plus#43 | dash#45 | dot | zero#48 + | one | two | three | four + | five | six | seven | eight + | nine | caret#94 | lodash | a#97 + | b | c | d | e + | f | g | h | i + | j | k | l | m + | n | o | p | q + | r | s | t | u + | v | w | x | y + | z + + +@mnemonic(crystal-visitor-tribune) +data Name : [Std.AsciiPrintable#diet-oxford-window ^ 1..0x28] + +@mnemonic(union-drum-public) +data Precision : indivisible | deci | centi | milli + | deciMilli | centiMilli | micro | deciMicro + | centiMicro | nano | deciNano | centiNano + | pico | deciPico | centiPico | femto + | deciFemto | centiFemto | atto + + +@mnemonic(liquid-owner-london) +data ProofOfReserves : utxo Bitcoin.Outpoint#dinner-yoga-danube, proof [Byte] + +@mnemonic(bundle-turbo-verona) +data RicardianContract : [Unicode] + +@mnemonic(mike-atlas-store) +data Ticker : [Std.AlphaCapsNum#magnet-section-latin ^ 1..0x8] + + diff --git a/RGBStd@0.1.0.sta b/RGBStd@0.1.0.sta new file mode 100644 index 00000000..bb98bc94 --- /dev/null +++ b/RGBStd@0.1.0.sta @@ -0,0 +1,419 @@ +-----BEGIN STRICT TYPE LIB----- +Id: urn:ubideco:stl:CBYcrv2NR6MTaDpoe7sjz39FV9fJ5TzKNzMQ1NnZTZBy#number-weekend-october +Name: RGBStd +Dependency: py61NAh7V4xHa7if2mF88KL3Z11rUruBNQEAsEqaf2Q#stock-sonata-carlo +Dependency: 5teCJyjMWaxbQK8vdga2soWh2U7waERS3ev8KHShJcgv#trumpet-scratch-pelican +Dependency: 7EpM1uymEteG4g4xmF5ntKYX1wXXpbQj5iLiDreH4jWa#protein-donald-cool +Dependency: 9pKFs7Gw7gwerYGVcPCDqiCv5fa165qC6PvFxiotJjaG#rebel-herbert-tourist +Dependency: DVtm25LRKU4TjbyZmVxPhvCmctZ6vKkPKqfpU2QsDNUo#exodus-axiom-tommy +Dependency: DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco +Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy +Checksum-SHA256: 8a33b31fdc4f13d905ddadab714acb52f36610019449ef13fdd9443c849d6c02 + +22w{tQ*>kp3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2O15!sqNU3b>%M}y +z;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm03sZD*X=8L$d2nTOT(C5e*2&|@7ZL8K8p| +GAt|gDDdvc%!k2x;ddcL`H3`1{iZE18?WpZg|d4l|Jm0wKdX15oFQo;tORnQe30E +oyhqL?3u+Bn$C$p%7DLvM0rxw8kLTBlY?hC@Pbx)uvRkBn&f=uiF4Ermb|dF>Bi1 +wm|eR!zYK%tl@;WNu_lcw-g2$nLVb<*lb*ENIx0;35YAw}=B%bY%5x6JjIwIj2eq +liWu}$@z+_xPw?-wb>Rw7=FYk8VUzOX>?<6X>JDvL2PwaO#%RI@1Z8)ymjIKNK5; +L!8FkfGTe+FK;UUh9M-4n+}vRYOle|MX>?_$FjWFA`CQ2GiK9iLKbGE6DZmrA4)G +`0A&^0p`%?-9Ole|CWClV|LvM0r4*&st2VDR_OBR)w8yCZ2EylR&t_^>1Sz?kFbz +0>alMxYAVQ_L~bWU$%Wl&*qbZ%vG1JyK;>qK>mX$cszrKCL=@F5H{a;)B(Tlt4ro +g*WC5Jh-!Y-wX@bW>$vY*ct@WDm9jq6_bZBp6I6q +=8aZ}RBA(1@GcO9QSWZ!o3C{DXc_Cg)w39@m$R6qOEzWQ ++NTC@=;D6L2hGcZ*om#a%*g5P;zf?W>0W(Wpq$-Z*OLQ^Sdrc0)vtr8NI_y=Rt +>&c#xvzLw|phByY^(xb%P=L2hGcZ*om#a%*g5LTqniYgA!ya%FT-a&K>Ds_h*B52 +xkgF<&7IuSK>`LwJcVYhKyAqBwo9%~?|r96@elXm4^&WpZn5Wl(Z&Z)Q|saB^jIP +;zf?X0XO_u7-Qt<6xS@-s>{OM>iY*&c?b?aZznm(1lyi>kUF|X>MdwWnpYocxhy@ +ZeT05|jA;vvYupWm6Q)O{ZZweWZ*HiKem1 +Z9kJM|+S+XYD&bY*ifyRPVjiFd`Y2QhLn&64&owka*miGSR>-o?7a>3`V^RAF#VZ)9aiVRL9 +T+8q@+Aa1+e+@!-jhcW8%o2S}z-#y5JARJB>wYeM!OmAarRB3HxICTWEOMDJSZAY +FLM|~u8B!Bn=Wb8dls`ok|_d#@P2~%ljQ)6;zaCBd+*=^-NPQ?`2v5jYd+6t@dEh +Y>7H!Y*UdZb-BpG^u(WnpGhV{&P5bdWn_aCwA}8zxgKp +y7|rEn>a@Jg9&ldILR+=b-aAzAVr?5I2ooM2UlryZe??Gqk=;7%h%D+p%U7S;b1R +T)c9`>#Kd;Rz-U=aO9W+B1XOrwWTL +Lzo&{8RR%LRjg@kugo@o29zwXDHA;ech!BqJAy+4@X(~&*rw>NkSNp5sya&BR4P; +0g`38@&rwvr8Q$XKK#ha*N>X+Ls92fzOv*E(~7PRR#MWnpGkWpcj!9{gsd8U18ZY +C02#KAOx^Y=h@bX*KmV{&P5bWn9-Yh`)Fa%+!|DA9Vsm&hHC4WXN2 +M4aZ(WL^Hp>3BS~hw-BaLV0v$Q*?60dm);?_c?BIMu4qFRxf<)p=@qHCf(fs{C;c +$=G;UARCwrWK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#N4?X)a%pCH3I +H&be&!uvG+Da^2;||fJ!&Dp*8BS%F@mRgsZfv!yd +427@;7veO2zMB=|GYU;*a%*g5NMUnmT+QYFd;Umr-dgNEFCuu*?Wk)@WS(Jw`th( +K{eY_63r%HmYiwmgY;R+0h0#5^R?l+2>x*OcO&#*^E;5@PQ20HKbE5LJk_Il(3r% +HmYiwmua&K>DllNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o4pL=vWpZ|9WI +}m#WpgphxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%MQe|^xa&~28LV0v$b +289u-wJ_twG#X)hKN+6jt=Q-)rE&S6%Zno!Jj~rv9u3TWpib6c4cHjd30rSFf`b; +xt8-)z}-IneIMOkG~3NFhnExe0MKl@b~cOE&{qgla%E*sZ)9cf>JtwI*nu%&Q~z; +Vl^%5wS6(#;{6ajG64wDPk{-(rQe|^xa&~28LV0v$b2I}|M?zKr1ACLTJsO2B2U! +6ncg?mz@CdC==Kxq?gSEg)z2E{|2tsvkWNc+gWCe5J$xzO!^w7hb16`x)q0rkjWP +;FH9)y-8%N3?sW)VSib7^O8ZDnqBS7~%^Wpi@|Cc3beJ2)mw;Q#B6Bx82BW0Y?Of ++v5xQ>l5Q8t$IA>9E^!~{d-M) +UE&Ds@L7b8}E{a}}9qWXrXyKnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQhzLn;aCL +M|VQ?8lL_yb)N?~LW;<=;2Rt!{5uU^s5+a+mJz|^@_ktG>Vb#!obbU|}-X=iS2Wo +~pwWo~72X>%l3QrKmH@SMtO +BR5nML?B>%qbz^!%<&Wu0B;HjDvS(4Y;;Uvd1Z1jQ)P4}&o7AOb4sXDcZFEbh@7% +()~G3UWM(~vzSM#vX6T6uRB~Z%b7^#GZ*D5`MM2gb*yIgxLg7xQ_Wp*<{#EXTnHM +p{o_cMFjX)Sdb8~5DZf#|5baO&%X>MdwWnpYocxhxVvZekPz%WEGnBZKS8(M7E9_ +@AwVcyGtCevi|7U8=IR&Qx!Q*>c;Wip;tQ3m-<6)UHjqig^*m4co5us7ukl*0UQz +s7w8g$YDqbYW9;VRU6QQV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y^RB~Z% +b7^#GZ*Ek1aAh{ZG@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(A}fV`Fu4a%FB +~Wpg;n6ySv-$KyGIMwGI{nOJpGrs&EH4&msPiMok*8}kcObYXO5Q)6glZDBbl^WR +EqS2tt~EBII@xVqZNcP`ond^UU-JbUWd$~GNAb8~5DZdPw;WK(oubY((pX>MdwWn +pYocu;h5LNH;4h{)8d6ed8&{mB@6CZbEf#WNc+d?dHP> +9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNAIR$**qZew{=d2nS&y&7&8`-VFfe10W +fHD}v`L+>hHy6d9F3e5?wo>3YSP-SFga&u*FLvL+uX>@I6Zgfg$dIyj=yj0m~TwL +F91B-Lz;+I~gZmLfZ*F5{VQgh&Ms;pyX<}?;OCMj_98Yz0aCLM+b8~5DZf#|5bW&w@WnpY(WJFh4yMm@yy5!CspS(8jyPH;|x<{Xk~3-Q)6glZDCgESaNdD2uBZZ +^){0PDrWHiJhF;R`XnM4fD?zDpt}!4Z*FvQVPkYiX>)XMa(P!y1Dlv2GgcwhyoKA +15f!oiUqrEIR!#9W1W`<`8<7b?ZewU~a#Lk=SQ3>DAd9q3vF!EgI>niq&gF@?Xwk +09NOmoW?4BAt4OeM&Ze??GL2hGcZ*p3Xa|tC)BU>oS@xONigke(HCtahRyiRHf-T +g6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXj +GZd7@2WoEROgpb5|Ibh#3lIwO7kh2b~5Yat1R4r0u5eSq}aSug!bY*UHX>V>*V`y +bFWNfUk-rA3DGt2Q_Id+K%nnjzc4c8~Wn@8gbYWv?ZA +8ZOFKPukLlqCE=E5w*=z8TWl=ueJ45i$M_H~V*5K?7!WnpY(WJYyvXK7+=WpE8;5 +VC@SZy&ckd7ius)Glx8aoM{I9mVQf}mY;|RGfgb0V4v@cHO73HjlbgF +m42mCs2<+~e+;O=m63^mMAVG6;X=iRyWp-s@Y-MCbVRT_aY-w&}Q)OXnRCrKya)J +yEuWS7@0e2{bYWv?No0k%_$#~gq^1qCz +duE|50q|rgTt*-ZIkqGqXDRHN7@cTY-w&}X>MmmVPkY}a)LMnX>MdwWnpYocu;h5lMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB +-q;n)I5N1y68qb##-!lw1;)SBG%dXmxGxLL8mnw6u)Qc}1I}@VaR|$Sxc~b8~5DZ +dPw;WK(oubY((pX>MdwWnpYocxhymQq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!` +1dtF2Q)6glZDC1dmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWSq$ +zGKko7{HHTs0a-Sb3*2e*gQ7wrpk*2XXa1TTng&y2a%pgMp9m~TI>-W|y2ahx3nF +|Vuawki#7NH?S|Q-Q!u2{b3PW#hbaG*1bV+2O0zdO*dUpyI8%sl0vW;OZAXH%ada +&2ptlsI;%gD7EL349yXKrm}Zgg`(Y-w&}Q)OXnRCrKya-!0L1KGjKL;n+-tOZHsZ +4l|5$r%8I8frlHV#NU|*#=2-b9H5MqWbEda9o^`%-h{Y?T>Kfj`b9SKFB^?WVLEr +!&9xW2|;XiQ)6;zaCD|M&?l3AY|w75*S~$Vs`o%nCW5yL;(W&@n*(t0buJlHd2nT +9L349yXKr&sY-w&}Q)OXnRCsA*ri?I=M@z~&!eWfal|+p!-KxbDp9M3OtM)uqVFw +o`4MuftXK7+=Wm9xvbY-ccdRLRko603iZGCpt_aPM;f&t6$4Wi|KW;46+RYwMb#!obbU|}-X=iS2W +o~p*Wp-s@Y-MCYbaY{3Xu=-s+yK+Q;_HtBn{qn)u@JyEm+8*~Xc?3hrUVCR$_iI$ +bZ%vHb5C+)$C#$rV>Wn19@Eea4XlBy!~LV$aBOK~X>?O% +VQf@*X=K%nUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl=HdlOZg6#U)$WoGNr_>4e9YQ#rf +ba;u!+d5tm#=h2RwFD4YLug@XZc}Ara%FT=WnpaHg2RO&x<#e~nNqkL0elonBu;H +BU4ux85TwZsP_-KxSVL%GX>LJoV`y)3Q)P5bWpZn5WkPIkV{6@oW&m$tWDykZj`7 +#3_zANbB(SO{shhGe=&H{tM@q*nHzp +%O_gxL;Ro0E2(B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_$Nρh +viK~w*eJg04e;HYn$=SsX>loIF_owDud_0-;b~{_$H8YPU!!A-5yM58 +(94FP(7*JmC%?~bN>dRB2u)>lVPs)+VdG=HA0T33ADWSZ3vdPZa|h%Bs4u_0RybL +G_h)o@9S%WmV`y)3Wn@BiZe(m_?t8o+`-uphG|cdBR?oL=+M>y2b9zMWEakNXv#+ +m-5?DiMVQFquWpZt4ZeeUwWnpaf=VS|@#a~>A4<=3rUs~wj;v~#Ci0aE@g3tkR^j +{_qSVL%GX>LJoV`y)3Q)P7d^sESGu0eNZ)cp(*eFU-DRQ(QTUJ^TE1nY56>E%WYM +s;pyX<}?;RC#b^{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw4?}NmV`X7% +Wn@8gbYWv?|7c^tcv66A`G>fIsWD3szxrX<=@3PGN0jBxBmYd`j`^ks$BCfWpU#p;waB@%y7JSePTR4{ +0I#2~curZE19Ac4b4eKzFwpifU>+kL+OPUE)K_!kK4Mr@gozMVVRC6x!ZDnLe +X=Q9=b5mt)Nn~a_Hy^=RazA{q4mp$>6&gjh6mW-8UF9q5R4M#zVZjhiVQpn(Mrmb +iWOGwxZAoNjR*)DI9k(f(pV)&)mz!uTslgsaqN#1;VGFe2#7}?ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^aqWo=1heReWQ^$)wLRjVX&@^ +5L6#o!4Vg6R|#+oDj`CuGOy1xaLOZghduEF{;%=rY;EV*SYUkC2@|hbX)(!!T*!6CpSAZ@ +ZpjiDMu$$f>uzFMDM-ztyUwM{z*RC!ZnZAoOrp^%2p`Y^ZFUEFF14acY7qDf33oE +m}demSXL$A1zBOJ#XebY*bN*VP7EGy*S=nP^gIFHh@#z{+#L^D9E+qxG=WVR;M(R +$+2!VQzHVnwqL9_3Tn6j|)=^4vRGW#I5ABd#i2%y$wVSVQC-)P+@dv+ezD&4n+e& +OtWi=!lh=B`!^s3PkSNb9F)Nx?_jo81XFZnaPUqnl)he^EQH3x+@dOq%{j@)U=mq +n3aL}btzwMTkP=mHX>V>;VRC6T!Ej;9TxQjc0+10Fg2)p25@y^Y-wWx!34}kUM +ys8WKDQu6}!mpvbyE1r(Y~+*plEP2LQK-VTK~nd#>CWCFni%tl@;WNu_lcw-g2$nLVb<*lb*ENIx0;35YAw}@ee +BGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du+Fb!>ELaBO7)!34}kUMys8WKDQ +u6}!mpvbyE1r(Y~+*plEP2LQK-VTK~nd#>Afqc{r20Xt>n}^(6@;!@_=#)b7 +^O8VRUtJWdH~O06+i$000000093000000000m}Z*FsGXKrm}Zggg0Y;$D>3V_iIEYZ7!Znc8lg5(`h}p;*1` +QLuOF9~|)mdy}<28ig(gSpg+?&9*`C2(3=%09avzwZKZf-~wC$h0?v-AoToZaEOX +&JGP6(KpxCH8}Lxy;oz?oA=%GK0000000000|Nj60000002WMq&WpinB0t`vF3+Z +EBJZ5VWbTOIQZk!SePv)Umz3ox3cj_M;@g8Z$^Iq_=QIcV2fVAU(o7`&egu*H=(E +JTsSQH6W>jz?WZe(m_a{vhf3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2O< +72%aAYx%3nvsGFa0T~s2jl^$FTcH3I9Yx7XLNZT0000000000|NsC0000003T1e7 +Wo~n6Z*Fq{2?7jBw+rcGT|8!M5_B<{+HRZ@3s2^uSiS90uy^Vo9Pt_>v&BHOB4j2 +9{b8u;Z#r2I1#bA%4sv!gV`L|@uD1XH0000000960|Nj60000JaV`yb*EG#W?^Gxa{vkfJIcU;0|?p#+${pKVqYC0 +g0rRqPL~9dN^Ow4Up{i1etLIeLdw-15uk&r&!)SUH||9000000RI300000001I<< +aBys8ZDnqBa{vhe!7Vc3w5*%8ouvjY6O_7-YK;s2`6-~000000000 +0{{R30000003t@D0VPj}*Wo~qH015&ONw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLu +OF9~|+7aSf9!PV~dK2uo>;u!nFdemP_$e?^hl+JkM;eY!XR2mk;;0000000000|N +s90000000000000000|Nj60000003Ug^^ZeetFa%FP>3IXEO6;Kh;hPv9L38+j;K +}xwT<$*JN%D`Il^nAqV=^+6@>iT4fCC@R*DMx@D%h#soWN50gvN+?s-fJT5C4Vmf +0000000030000000000FLvL<#X=iS2Wo~qIa&=_}3V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|)mdy}<28ig +(gSpg+?&9*`C2(3=%09avzwZKZf-~wC$h0?v-AoToZaEOX&JGP6(KpxCH8}Lxy;o +z?oA=%GK0000000000|Nj60000002WMq&WpinB0t`vF3+ZEBJZ5VWbTOIQZk!SeP +v)Umz3ox3cj_M;@g8Z$^Iq_=QIcV2fVAU(o7`&egu*H=(EJTsSQH6W>jz?WZe(m_ +a{vhf3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2O<72%aAYx%3nvsGFa0T~ +s2jl^$FTcH3I9Yx7XLNZT0000000000|NsC0000003T1e7Wo~n6Z*Fq{2?7jBw+r +cGT|8!M5_B<{+HRZ@3s2^uSiS90uy^Vo9Pt_>v&BHOB4j29{b8u;Z#r2I1#bA%4s +v!gV`L|@uD1XH0000000960|Nj60000JaV`yb*EG#W?^Gx +a{vkfJIcU;0|?p#+${pKVqYC0g0rRqPL~9dN^Ow4Up{ +i1etLIeLdw-15uk&r&!)SUH||9000000RI300000001I<s2`6-~0000000000{{R30000003t@D0VP +j}*Wo~qH015&ONw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+7aSf9!PV~dK2 +uo>;u!nFdemP_$e?^hl+JkM;eY!XR2mk;;0000000000|Ns90000000000000000 +|Nj60000003Ug^^ZeetFa%FP>3IXEO6;Kh;hPv9L38+j;K}xwT<$*JN%D`Il^nAq +V=^+6@>iT4fCC@R*DMx@D%h#soWN50gvN+?s-fJT5C4Vmf000000003000000000 +0CLvL<$VQFq0|5edG6D%hZ*FvDZgfdx1O)&Fb7N>_ZD9Zf0Rjw3w+rcGT| +8!M5_B<{+HRZ@3s2^uSiS90uy^Vo9PyM=)7t~9tEf?*r}jS36zkMYeK9}${s8)2B +zjZ?kPra}XJu|>b7^w`1pxvKNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+Y +2rNlD$O59e#ogQsB77jPl+h5j^*S;F1!-nsV`TsZ0RcP8z<~n@;VY| +KA!vt$qMEp^75#kD_Tqj3WXX=Y(#Wl3#tYybrT0anNlc)Z3!7CPHT_+D +q|&?jn_(4)LjFAF^$MA+G=`ve7Zb#QQO00jX7XEKMt2yp8annvOGPI~_sbHU;fx2 +Gv#gJM&>FkgU`3qx;ibY*UIQ)y>&1pxpF0U4*5`UypwubFv$g*Ow$20xV_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+~XBWLg67cp3gzo-sO&$va11 +I@T$h!rSEX2t%Czh%J2?7jBw+rcGT|8!M5_B<{+HRZ@3s2^uSiS90uy^Vo9PyJ7y +nwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJ0o0000000960{{R300000000000 +00960{{R30000d`Z*FvQVPkYtb#QQO1_laaZ*FvQVPkYjWC9FHw+rcGT|8!M5_B< +{+HRZ@3s2^uSiS90uy^Vo9PytBEJ-@Z0;0Ob-P{Wzd?2rs)M&&=&l*}G;Jw22Ix+ +@yX=7_;ash^drrgpIbK*hY1R0$Wm8#)1@ooF7D+3=H&lHSNG6x84Wn^h#OKEff2m +k>90000000030000000000BXKZg`VQf=$VRU5x3IYsCw+rcGT|8!M5_B<{+HRZ@3 +s2^uSiS90uy^Vo9Px+#;$>KfZ0H=mhJ>?uV?pA9RqgJsQF)~2<)1*a`BfGWZkxd_avHyWRv +ZEhNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|*E!8D=zpn(&o-7tVWUa<1Q{ +n`|;)uYyv!)~4rGOBq10000000030000000000BVRLh7XKrm}Zgg`13Ia%}Z0ySw +6Z7G^(Vdq=xngp5l?pA9RqgJsQF)~2<)1*a`BfGWZkxd +_avHyWRvZEhNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|*E!8D=zpn(&o-7t +VWUa<1Q{n`|;)uYyv!)~4rGOBq100000000300000000007a%E&?Wo>f+2?9u|Z0 +ySw6Z7G^(Vdq=xngp5l?pA9RqgJsQF)~2<)1*a`BfGWZ +kxd_avHyWRvZ8T000000093000000000SgVQgh?V`*h`00{y}sch`a6%+H}y3w7N +L%Cvdc9ihwVg6yH$(01#_!hsY6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^->bepVa ++00000000300000000006WpZ+Fa&rI)000310000000030000000000HWMyVyb!> +D&b8~5DZf#|5bN~bb00eGtZe;)f009JZZ*64&1pxv`sch`a6%+H}y3w7NL%Cvdc9 +ihwVg6yH$(01#_!hsY6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^->bepVa|M`dnhb +7^x)W?^Gx1_cOhWprU=VRT^t1OfmAZf|a7000011aog~WdH>M0!XQB?8_As^WnPD +otHzoVsdtr@aSRwVWi2G1l#x)ziR}e6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~c +YjR$9JZ(?C=a{vkgNU3b>%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0s1)odun+a000000RI300 +000001IJrb7^O8ZDnqBa{vkgNU3b>%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0 +s1)odun+a000 +000RI3000000010+sY-Mg^X=QT&2?9u|Z0ySw6Z7G^(Vdq=xngp5l?pA9RqgJsQF)~2<)1*a`BfGWZkxd_avHyWRvZ8T0000000930000000 +00JMa&m8Sa{vhd00961000000093000000000X|Y;R&=Y)NKeV`T;d1#@L>Nn`*7 +0ssVVZ*FA(00035b8l^B00jX8NU3b>%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm +0YXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2y$g{b!l>CWCFni%tl@;WNu +_lcw-g2$nLVb<*lb*ENIx0;35YAw}@eeBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM +2r7_Du+Fb!>ELaBO7)!34}kUMys8WKDQu6}!mpvbyE1r(Y~+*plEP2LQK-VTK~nd +#>0@0yW@{33F`3$KoDvI9=Al@K`2Olv2~%1FNg3QJ<&wKF}2F)J=UcKm7g +x`duV?R0NO^0gPFpNe|1*g;2%SV3qa8&Ht7Gb&KV=eTubgaWzHs?BigcO=3$@@zc>v~)l(u_-V%fmk-0000000000{{R30000002WMq&W +pib7015&ONw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+Y2rNlD$O59e#ogQs +B77jPl+h5j^*S;F3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2 +O9%;t&UhuI|l3{0nwBvu9+-mQH!YVG%{0&=J6bV)90000000000{{R30000001#@ ++9aBKhy0t`vF3+ZEBJZ5VWbTOIQZk!SePv)Umz3ox3cj_M;@t+7RNjk^^qPoT1+z +TRnAg`3vXv9d*8d@RXy~6c6G5`qy!7Vc3w5*%8ouvjY6O_7-YK;s2 +`6-~0000000000{{R30000000000000000{{R300000031M?{Wpq?wXLA4w0t`vF +3+ZEBJZ5VWbTOIQZk!SePv)Umz3ox3cj_M;@t+7RNjk^^qPoT1+zTRnAg`3vXv9d +*8d@RXy~6c6G5`t!3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2OhyLPaScq +)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0t`vF3+ZEBJZ5VWbTOIQZk!SePv)Umz3 +ox3cj_M;@yU;xslx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuK)l5000000RI300 +000000000000000RI300000000&}qZe(m_a{vkg3`w^O>0@0yW@{33F`3$KoDvI9 +=Al@K`2O1ACLTJsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{|0t`vF3+ZE +BJZ5VWbTOIQZk!SePv)Umz3ox3cj_M;@kNTrzegi%Q%1`*IadPUvJHjC=x|NK{gn +A{C>lLf{{R30000000RR90{{R30019PzbY*UHX>V?G015&ONw*8>V_iIEYZ7!Znc +8lg5(`h}p;*1`QLuOF9~|+O$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUd3 +`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2O8Y8pCK(iubCI|gtsOoPzSq}wn +_|y(^b~9sSC$p}%0000000000|NsC0000002VrhwXm4_J015&ONw*8>V_iIEYZ7! +Znc8lg5(`h}p;*1`QLuOF9~|+CYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed10e7tM;q +}13`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2O-Gak~A-YAT1DR5|8v%S2N+ +eEgD_w&~i4dg84N$ck0000000000|NsC0000001aoO;a{vkf;?xyT5z&Ua+M@}mO +iDpYxh>^^GknUxTJ!XL#OUcE0YU2eWQiruG07=MfE>%$rsrg6s@r +81O#qjZDjxm00961000000093000000000GLZDDC_00;uX1k6TWEM#tEO?YD!yU6 +acy5+5>Uo2?YlHei-0Jn$~O|Hl?=EOIWdnI1En?j0**$q&r%+O785w*9xUuMn#00 +000000300000000005b9HHSWdXt7{1?oWmkvdn<~@3k`62|yGT60&_N-=Q={X5VG +Q0wCYXArU06+i$000000093000000000F^W?^Gx1`G#wWpZ4W%8u2#v4;@)Mr(4W-G9AqmU2DivVVd*fD_Oun1{xXk~I~baM +a+0XxdTfddHPE2~=}XorO3wsWOd*yR8%b;g^;wLfB`aR2}S000000RI300000001 +IbqZ(?C=Q*>c;WdI5SNU3b>%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0s1)odu +q7+-P0pRHy9#P +wI%M}yz;kwb +CmqWQ?a(0yP=wbe0q{)>8+xQm0s1)odu#}PNp!L%7{0GY9xpq!KXGXMYp000000RI300000001 +0+sY-Mg^X=QT&3Ia%}Z0ySw6Z7G^(Vdq=xngp5l?pA9R +qgJsQF)~2<)1*a`BfGWZkxd_avHyWRvZC7Yw`7y(SHDgMM6vX0;lo=W-SMLKDgmd +c1Y|2T5mr900000000300000000007XJu|>b7^w{n}EFm-H4UIKYZk@6eD_N8RtQ +R*xko2unDt^rFY0a3v_Z}ZgXjLX>V?G015&~sch`a6%+H}y3w7NL%Cvdc9ihwVg6 +yH$(01#_!hsY6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^->bepVa-p`J)YgsnBAzS +^lCDM*R{Bm4V0GuhLrctMezR0sct0000000000{{R30000003T1e7Wo~n6Z*Fq{3 +Ia%}Z0ySw6Z7G^(Vdq=xngp5l?pA9RqgJsQF)~2<)1*a +`BfGWZkxd_avHyWRvZBidQx#RbU13`&@i)cN$nZkmpfUx8p+P}^HA9iOEY@_0000 +000030000000000GWMyVyb!>D`aAk5~bZKvH00aU61a5C`WdHyG0R(ezZDjxj0Rl +*=Z0ySw6Z7G^(Vdq=xngp5l?pA9RqgJsQF)~2<)1*a`B +fGWZkxd_avHyWRvZRpa&m8Sa{vkgNU3b>%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+ +xQm0%-7WhS~LPLkC|vvXfIFef56If!1F6YV_iIEYZ7!Znc8lg5(`h}p;*1 +`QLuOF9~|*q!<5V6J4m)zlTf>a0FkQJXa(QqD}&I_X{w-LKi^UZNoHYVWl3ZO0RR +U806-uB2}x#QV`WKgaBKz%2XHNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+NQ +q$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF1X=Y(#Wl3ZKJIcU;0|?p#+${pKVqYC3ukO^Vqt7kbYXO500{wZuUGL{Xy)Mw=b<25wR$~ +Ei5PTR^^(=*8_lgL3Kl&80000000030000000000BVRLh7XKrm}Zgg`12?4w>V$b +$O`Lthe{A<&Vw64uD$RCm16t&pVa^SGX4=Dfu000000093000000000SgVQgh?V` +*h`00{vtS8PJ1$~AY)t>jV_vr1id1HuemA^)WtRucMS>ULHD0000000030000000 +000BbaG*Cb7^#GZ*Fq{2?775q4V1Kn+{$l|6j{!pvNr$# +000000093000000000VQcywiMb7^mGa{vhe{POU@1tY3rsOkBlGpZi!3YVSIq5B3 +YVVik8aFqsA0000000000{{R300000026JO_X>fD`3`w^O>0@0yW@{33F`3$KoDv +I9=Al@K`2OoXH(Bh}d)dr!!swSvHgl+-dWJqCz5|Wf}oz{+b+`2}x#QV` +WfbX>tYv1!-nsV`Tvt;g=KJ{_2G`=Q@6b6q+T;`%4w;dR!OMj7xOO!#^VhX=!b6Y +yp)Z<;+yn*{enpvrQCw&fd_X^t|&ksO!wr8TKxhZ7~K(ZE$Q!WCZ~L2LJ#-AOHV_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+Y2rNl +D$O59e#ogQsB77jPl+h5j^*S;F3`w^O>0@0yW@{33F`3$KoDvI9=Al +@K`2O1ACLTJsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{|7*1hrWn@NaWo +%?Yb8~5DZf#|5bX0k8Wd;KRX=DNnNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9 +~|+A{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQqZeeX@0!XQB?8_As^WnPD +otHzoVsdtr@aSRwVWi2G1l#x)zo-=KD6s8S?e4Bod8Fs%pFp$uRTdC#o53z}8oz# +490+n{b7gXNWn=Ycu5$>lN%N|>JtwI*nu +%&Q~z;Vl^%5wS6(#;{6ajG64wDPk{-(!PGN0jWJYOaY-B}vbY*UHX>V>+d2nS00| +IGe0t`vF3+ZEBJZ5VWbTOIQZk!SePv)Umz3ox3cj_M;@nm%#La7y@JVOzJ)&GXo9 +MeQ_qmbcB?4VH0I#X{*-UM!8ZDj&Tsch`a6%+H}y3w7NL%Cvdc9ihwVg6yH$(01# +_!hsY6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^->bepVa^a%FR6a&~280$i{(k=Du +M$QKdrry9#1TdpOKse5vu1&=u{+IqgZbMNXC4+YqPF=12xaaxrgbrDxyH3xis% +LHy=ZDj&Tsch`a6%+H}y3w7NL%Cvdc9ihwVg6yH$(01#_!hsY6znLl?N#mWu2FfU +=jES3v-wpP5N?~nE^->bepVa^a%FR6a&~280$i{(k=DuM$QKdrry9#1TdpOKse5v +u1&=u{+IqgZbMNXC4+YqPF=12xaaxrgbrDxyH3bepVa^ +a%FR6a&~280$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZbMNXC4+YqPF=12 +xaaxrgbrDxyH3@6CZd7@2Wd;KRX=D +NnNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|*CQV*^ZmKt8YDf|&5KZQ>65I +6*X)C9iYp+?yjr7~y)ZeeX@0!XQB?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)z +o-=KD6s8S?e4Bod8Fs%pFp$uRTdC#o53z}8oz#490+n{b7gXNWn=Ycu +5$>lN%N|>n+a0S0nuXJ~YD0000224QV)b#8P30009AVQz +UuVRT^t000CDVQzUrbaY{3XaE2J1q5VabYTDm0Rl*=Z0ySw6Z7G^(Vdq=xngp5l< +??b{$Zral?2=P7Qbr*qZFQ|l>ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^&wcWz~5Q +*>c;Wm9!xLy +>KYADn0nN5*PJ2Df`6dPSE_hLGLrH^Of!c_2>=XJV`ybh4y +Mm@yy5!CspS(8jyPH;|6JIZE$RJ015#+%D{mG2;nQMTOnwNgyXhzrB~SH04;UKo5 +i(1Vxw^Zl_2HJRMgq4MiR446nf6y(4zFb^E0UH%+ne6E|+aF0000000000{{R300 +00001ygiyV`~Nn1!!+!a%2H6f8XfKVJ8t<%y5>ptxvnbpz@B5xQKYcrlhLh;!c7G +XlZkFZ*qA63IYsCw+rcGT|8!M5_B<{+HRZ@3s2^uSiS90uy^Vo9PytBEJ-@Z0;0O +b-P{Wzd?2rs)M&&=&l*}G;Jw22Ix+$bNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLu +OF9~|*k=vZ=c&j?2kZ}m2l1S)3m|2(paO!_1u7=ROpoS?e^00000000300000000 +00DVs&n0Y-LYyNp56icmN6l3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2Om +B{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0pR1!y@vKxXQp(vKY?)Z_|%s< +YC#qfqTH%sQn&BKB>(^b000000RR900000001;tsV`y)3LUnFrY-LGqWMy~&3IYs +Cw+rcGT|8!M5_B<{+HRZ@3s2^uSiS90uy^Vo9PtBtleIk>g)RqK0VQ|Mwn6X+txo +3vSYd;;z)HQ~0$c(NNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+CYgi@C#* +klFTE}3hP#3Wmki}o*nL&Ed10e7tM;q|~0000000030|Nj600000DV{dMBa$#e1N +p56icmN6l3`w^O>0@0yW@{33F`3$KoDvI9=Al@K`2Op9m~TI>-W|y2ahx +3nF|Vuawki#7NH?S|Q-Q!u2{b0W8#V&bbGUt!Bq`S1yuTOW~jDcd`iI3^X_>4e9YQ#rfba;u!+d5tm#=h2RwFCkTNw +*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+M5WIk~G+K)5% +bR49t5yk`^qQ9d0000000030|Nj600000Bb7f&{Q)OdvWpr}@2?7jBw+rcGT|8!M +5_B<{+HRZ@3s2^uSiS90uy^Vo9Py94!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>j +uaWwz{0000000960{{R30000M5b#QQONn`~900#g7Kp+4JRAq8)X>MU`1_A|hWnp +Y{00{yNNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|-Sd%Pd}i3puE%cmMV_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+vAw13V +aK{V4Cqf$mTj@V8rMIYD6=r4KMKQ2Qlu}9zRAq8)X>MU`Q)OXn1OfmJV{dL_WnpY +(WL0!{ZvX`W0)qT+m0wKdX15oFQo;tORnQe30EoyhqL?3u+Bn$C$!Hntyw$T9tCz +EwrAszt-P)%HZ|LbH=L2A=l(W4CP5}#dX>@L7b8}X2b#wp)0RaV_iIEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|-3?vf5kh_h+&YE#h% +O8d1V_{UOl9{V;uR#^q%%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm +0+M1fGDfR49CXWkK3l57k{KT!~vwN#<0lf`G4Pj{@0tIh(Ze?Tu1p)#LNw*8>V_i +IEYZ7!Znc8lg5(`h}p;*1`QLuOF9~|+A{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c +#qIM2EQoNU3b>%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0+M1fGDfR49CXWkK3 +l57k{KT!~vwN#<0lf`G4Pj{@4^(ntZgXjLX>V>xW?^Gx1_%gmaCB*JZeeT!!34}k +UMys8WKDQu6}!mpvbyE1r(Y~+*plEP2LQK-VTK~nd#>?pA9R +qgJsQF)~2<)1*a`BfGWZkxd_avHyWRvZEhNw*8>V_iIEYZ7!Znc8lg5(`h}p;*1` +QLuOF9~|*E!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq100000000300000 +000006X>M?JbaMa-0!XQB?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)zo-=KD6s +8S?e4Bod8Fs%pFp$uRTdC#o53z}8oz#490CkUw+rcGT|8!M5_B<{+HRZ@3s2^uSi +S90uy^Vo9Pu{6G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana00000009300 +0000000YNb8~5DZf#|5baMa-0!XQB?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x) +zo-=KD6s8S?e4Bod8Fs%pFp$uRTdC#o53z}8oz#490CkUw+rcGT|8!M5_B<{+HRZ +@3s2^uSiS90uy^Vo9Pu{6G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000 +000093000000000SgVQgh?V`*h`00{y}sch`a6%+H}y3w7NL%Cvdc9ihwVg6yH$( +01#_!hsY6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^->bepVa+0000000030000000 +0006WpZ+Fa&rI)000310000000030000000000HWMyVyb!>D&b8~5DZf#|5bN~bb +00eGtZe;)f009JZZ*64&1pxv`sch`a6%+H}y3w7NL%Cvdc9ihwVg6yH$(01#_!hs +Y6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^->bepVa|R$**qZew{#W?^Gx1_20iWpQ +W +N&Q`2xV|-b8lp6V;=`{WoLD4VRAnRW^!e5b!BdJe+_79XJ|%pWpQ<7Zew}>1y*Hp +PHzJO0(LL}0(LP02v%=(bW>$vYz6}cZDn+5Z)5_3{BM`7lcy62B%ff6&(P +G$SNoKcy!1~?PoRaGVc5iib0`+ +VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385?K@+fP1 +(-9sgE>i7rMzqbqHc?X>Md`Zf5`h2m + +-----END STRICT TYPE LIB----- + diff --git a/RGBStd@0.1.0.stl b/RGBStd@0.1.0.stl new file mode 100644 index 00000000..56e41308 Binary files /dev/null and b/RGBStd@0.1.0.stl differ diff --git a/RGBStd@0.1.0.sty b/RGBStd@0.1.0.sty new file mode 100644 index 00000000..362f5113 --- /dev/null +++ b/RGBStd@0.1.0.sty @@ -0,0 +1,416 @@ +{- + Id: urn:ubideco:stl:CBYcrv2NR6MTaDpoe7sjz39FV9fJ5TzKNzMQ1NnZTZBy#number-weekend-october + Name: RGBStd + Version: 0.1.0 + Description: RGB standard library + Author: Dr Maxim Orlovsky + Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0 +-} + +@context +typelib RGBStd + +import RGB#py61NAh7V4xHa7if2mF88KL3Z11rUruBNQEAsEqaf2Q#stock-sonata-carlo + use BundleId#desert-divide-visible + use AssignmentWitness#hobby-client-remark + use AnchorSetMerkleBlock#phone-loyal-sharp + use GlobalOrd#sofia-perfect-kinetic + use WitnessPos#robert-average-artist + use InputMap#ravioli-rudolf-inch + use OutputAssignmentVoidState#traffic-karate-stella + use Extension#stella-locate-trumpet + use Genesis#amadeus-mammal-maximum + use AltLayer1Set#manual-cycle-circus + use Transition#zigzag-sulfur-organic + use AssignmentsBlindSealTxid#morris-enrico-miller + use VoidState#nectar-ceramic-driver + use DataState#diana-archive-liquid + use TransitionType#puma-joshua-evita + use Occurrences#unicorn-empire-mama + use StateSchema#yoga-arizona-flex + use AssignVoidStateBlindSealTxPtr#russian-demand-kimono + use MediaType#light-nelson-brain + use TransitionBundle#correct-armada-optimal + use ValencyType#palma-exit-pupil + use PedersenCommitment#nepal-delta-earth + use ConcealedFungible#open-conan-barcode + use OutputAssignmentRevealedData#cobalt-visitor-salute + use SchemaSchema#apropos-broken-soprano + use ContractHistory#civil-basic-nevada + use AnchorSet#pinball-doctor-guide + use WitnessAnchor#phrase-pupil-llama + use AssignRevealedDataBlindSealTxid#master-rhino-rapid + use Schema#diet-italian-lemon + use Types#titanic-front-courage + use ExtensionType#mission-salsa-parole + use ExtensionSchema#salmon-plato-contour + use RevealedAttach#antenna-balloon-manager + use RevealedFungible#light-sonar-civil + use ConcealedData#mirage-invite-newton + use GlobalValues#cartel-danube-sinatra + use AssignRevealedDataBlindSealTxPtr#trinity-trilogy-atomic + use XChainBlindSealTxid#biology-domain-domain + use AttachId#delta-member-agenda + use BlindingFactor#agenda-ivory-blast + use AssignmentType#hunter-hello-retro + use XChainTxid#cubic-museum-lemon + use XChainBlindSealTxPtr#prime-loyal-escort + use Opout#india-joshua-adam + use AssignVoidStateBlindSealTxid#noise-veteran-gloria + use SchemaId#garcia-smoke-ozone + use OpId#slow-samuel-ceramic + use Script#import-scorpio-evening + use ContractId#alarm-danube-vampire + use AssignmentsBlindSealTxPtr#meteor-express-liberal + use Issuer#veteran-tango-content + use AluScript#soviet-arsenal-complex + use TypedAssignsBlindSealTxid#stuart-chapter-dance + use FungibleState#natasha-profit-winter + use Inputs#impact-wedding-example + use GenesisSchema#distant-bravo-athlete + use TypedAssignsBlindSealTxPtr#robert-event-mother + use XChainTx#roger-crater-escort + use OutputAssignmentRevealedValue#option-repair-ocean + use TransitionSchema#minus-bravo-frame + use OutputAssignmentRevealedAttach#ship-vitamin-patent + use WitnessOrd#rachel-convert-stella + use GlobalStateSchema#night-mixer-monaco + use AltLayer1#banana-mouse-plaster + use AssignRevealedAttachBlindSealTxid#subway-amanda-kevin + use AssetTag#buzzer-pattern-craft + use XChainExplicitSealTxid#ozone-quick-hippie + use Input#export-content-vitamin + use GlobalStateType#seminar-major-tape + use Ffv#silence-motel-toronto + use AssignRevealedValueBlindSealTxPtr#chamber-balsa-forbid + use GlobalState#judo-place-boxer + use XChainSecretSeal#palace-random-taxi + use XChainAnchorSetMerkleBlock#aroma-super-aurora + use Valencies#lady-paper-anvil + use AssignRevealedAttachBlindSealTxPtr#eric-budget-orca + use Redeemed#money-campus-annual + use Metadata#moment-patriot-patron + use AnchoredBundle#chris-siren-yankee + use XChainTerminalSeal#bread-tarzan-touch + use XChainAnchorSet#brush-mary-shine + use FungibleType#profit-bazooka-present + use ConcealedAttach#pizza-natural-cyclone + use RevealedData#switch-enigma-ruby + use AssignRevealedValueBlindSealTxid#colony-miguel-olga + +import StrictTypes#5teCJyjMWaxbQK8vdga2soWh2U7waERS3ev8KHShJcgv#trumpet-scratch-pelican + use TypeName#jamaica-capsule-chance + use VariantName#snow-gray-extreme + use Primitive#hobby-cable-puzzle + use VariantInfoSemId#clone-panama-guru + use UnnamedFieldsSemId#hippie-world-sandra + use NamedFieldsSemId#jordan-kiwi-nickel + use FieldSemId#speed-patriot-gallery + use SemId#cargo-plasma-catalog + use Ident#connect-fragile-exile + use Sizing#canoe-gordon-amazon + use EnumVariants#correct-dream-albert + use TypeSystem#panel-data-lazarus + use FieldName#orient-spell-talent + use TySemId#kimono-catalog-mango + use KeyStep#frozen-margo-cannon + use Variant#textile-cowboy-dragon + use Path#exotic-western-courage + use Step#wheel-patriot-sandra + use UnionVariantsSemId#iceberg-road-crack + +import CommitVerify#7EpM1uymEteG4g4xmF5ntKYX1wXXpbQj5iLiDreH4jWa#protein-donald-cool + use ProtocolId#gamma-banjo-corona + use Message#shampoo-bishop-morgan + use MerkleHash#culture-metro-modular + use MerkleBlock#miracle-antenna-moral + use MerkleProof#labor-hilton-magenta + use ReservedBytes1#joker-lemon-mental + use ReservedBytes2#pocket-habitat-soviet + use ReservedBytes04#dollar-falcon-analyze + use TreeNode#risk-opinion-orca + use ReservedBytes4#claudia-drink-digital + +import BPCore#9pKFs7Gw7gwerYGVcPCDqiCv5fa165qC6PvFxiotJjaG#rebel-herbert-tourist + use TapretNodePartner#iceberg-poker-active + use ExplicitSealTxid#antenna-darwin-emotion + use TapretProof#forum-paint-tunnel + use TapretPathProof#stage-element-update + use Method#trilogy-tahiti-valid + use TapretRightBranch#basket-prelude-bridge + use BlindSealTxPtr#austria-icon-waiter + use OpretProof#segment-ambient-totem + use SecretSeal#santana-domingo-needle + use AnchorMerkleProofOpretProof#break-water-octavia + use AnchorMerkleBlockTapretProof#tunnel-cinema-change + use AnchorMerkleProofTapretProof#noise-flag-special + use BlindSealTxid#kimono-golf-price + use TxPtr#strange-source-father + use AnchorMerkleBlockOpretProof#swing-percent-valery + +import AluVM#DVtm25LRKU4TjbyZmVxPhvCmctZ6vKkPKqfpU2QsDNUo#exodus-axiom-tommy + use LibSite#mission-papa-mercy + use LibId#rebel-factor-rodeo + +import Std#DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco + use Ascii#aloha-lunar-felix + use Bool#laser-madam-maxwell + use U5#nitro-george-nebula + use AlphaNumLodash#north-sound-salsa + +import Bitcoin#HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy + use SeqNo#rhino-time-rodent + use TxIn#pagoda-david-reform + use Vout#chrome-robin-gallop + use ScriptBytes#maestro-source-jackson + use TapNodeHash#crash-culture-jamaica + use LockTime#tokyo-inch-program + use SigScript#tiger-paprika-juliet + use LeafScript#brenda-round-micro + use TxOut#hostel-source-marion + use Sats#pyramid-spray-star + use Witness#quiz-junior-farmer + use Txid#cowboy-diego-betty + use TxVer#english-natasha-virus + use InternalPk#meter-nerve-chicken + use LeafVer#tunnel-lagoon-cowboy + use ScriptPubkey#denmark-human-degree + use ByteStr#kinetic-avenue-escort + use Tx#deluxe-bernard-genetic + use Outpoint#dinner-yoga-danube + use XOnlyPk#evident-finance-promo + + +@mnemonic(galileo-stuart-night) +data AssignIface : ownedState OwnedIface + , public Std.Bool#laser-madam-maxwell + , required Std.Bool#laser-madam-maxwell + , multiple Std.Bool#laser-madam-maxwell + +@mnemonic(cipher-cafe-koala) +data Cert : signer Identity, signature [Byte ^ ..0xff] + +@mnemonic(voltage-chicago-quality) +data Consignmentfalse : version ContainerVer + , transfer Std.Bool#laser-madam-maxwell + , assetTags {RGB.AssignmentType -> ^ ..0xff RGB.AssetTag#buzzer-pattern-craft} + , terminals {RGB.BundleId -> Terminal} + , genesis RGB.Genesis#amadeus-mammal-maximum + , bundles {RGB.AnchoredBundle#chris-siren-yankee ^ ..0xffffffff} + , extensions {RGB.Extension#stella-locate-trumpet ^ ..0xffffffff} + , schema RGB.SchemaSchema#apropos-broken-soprano + , ifaces {IfaceId -> ^ ..0xff IfacePair} + , supplements {ContractSuppl ^ ..0xff} + , attachments {RGB.AttachId -> [Byte ^ ..0xffffff]} + , signatures {ContentId -> ^ ..0xff ContentSigs} + +@mnemonic(polygon-axiom-float) +data Consignmenttrue : version ContainerVer + , transfer Std.Bool#laser-madam-maxwell + , assetTags {RGB.AssignmentType -> ^ ..0xff RGB.AssetTag#buzzer-pattern-craft} + , terminals {RGB.BundleId -> Terminal} + , genesis RGB.Genesis#amadeus-mammal-maximum + , bundles {RGB.AnchoredBundle#chris-siren-yankee ^ ..0xffffffff} + , extensions {RGB.Extension#stella-locate-trumpet ^ ..0xffffffff} + , schema RGB.SchemaSchema#apropos-broken-soprano + , ifaces {IfaceId -> ^ ..0xff IfacePair} + , supplements {ContractSuppl ^ ..0xff} + , attachments {RGB.AttachId -> [Byte ^ ..0xffffff]} + , signatures {ContentId -> ^ ..0xff ContentSigs} + +@mnemonic(felix-burger-matrix) +data ContainerVer : v2#2 + + +@mnemonic(jargon-brown-family) +data ContentId : schema RGB.SchemaId#garcia-smoke-ozone + | genesis RGB.ContractId#alarm-danube-vampire + | iface IfaceId + | ifaceImpl ImplId + | suppl SupplId + +@mnemonic(denver-almanac-cobalt) +data ContentSigs : {Cert ^ 1..0xa} + +@mnemonic(tractor-nitro-wheel) +data ContractIndex : publicOpouts {RGB.Opout#india-joshua-adam ^ ..0xffffff}, outpointOpouts {RGB.XChainExplicitSealTxid -> ^ ..0xffffff {RGB.Opout#india-joshua-adam ^ ..0xffffff}} + +@mnemonic(slang-mars-belgium) +data ContractSuppl : contractId RGB.ContractId#alarm-danube-vampire + , ticker TickerSuppl + , mediaKit [Unicode ^ ..0xff] + , globalState {RGB.AssignmentType -> ^ ..0xff OwnedStateSuppl} + , ownedState {RGB.AssignmentType -> ^ ..0xff OwnedStateSuppl} + , extensions {U16 -> ^ ..0xff [Byte]} + +@mnemonic(shirt-evident-mailbox) +data ExtensionIface : metadata StrictTypes.SemId#cargo-plasma-catalog? + , globals {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , assignments {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , redeems {StrictTypes.FieldName#orient-spell-talent ^ ..0xff} + , valencies {StrictTypes.FieldName#orient-spell-talent ^ ..0xff} + , errors {U8 ^ ..0xff} + , defaultAssignment StrictTypes.FieldName#orient-spell-talent? + +@mnemonic(yoyo-patriot-everest) +data GenesisIface : metadata StrictTypes.SemId#cargo-plasma-catalog? + , globals {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , assignments {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , valencies {StrictTypes.FieldName#orient-spell-talent ^ ..0xff} + , errors {U8 ^ ..0xff} + +@mnemonic(garbo-justice-atomic) +data GlobalIface : semId StrictTypes.SemId#cargo-plasma-catalog? + , required Std.Bool#laser-madam-maxwell + , multiple Std.Bool#laser-madam-maxwell + +@mnemonic(cockpit-cafe-cannon) +data Hoard : schemata {RGB.SchemaId -> ^ ..0xff SchemaIfaces} + , ifaces {IfaceId -> ^ ..0xff Iface} + , geneses {RGB.ContractId -> ^ ..0xff RGB.Genesis#amadeus-mammal-maximum} + , suppl {RGB.ContractId -> ^ ..0xff {ContractSuppl ^ ..0xff}} + , assetTags {RGB.ContractId -> ^ ..0xff {RGB.AssignmentType -> ^ ..0xff RGB.AssetTag#buzzer-pattern-craft}} + , bundles {RGB.BundleId -> ^ ..0xffffffff RGB.TransitionBundle#correct-armada-optimal} + , extensions {RGB.OpId -> ^ ..0xffffffff RGB.Extension#stella-locate-trumpet} + , anchors {RGB.XChainTxid -> ^ ..0xffffffff RGB.XChainAnchorSetMerkleBlock#aroma-super-aurora} + , sigs {ContentId -> ContentSigs} + +@mnemonic(ibiza-nuclear-vision) +data IdSuite : pgp | ssh | ssi + + +@mnemonic(voice-mentor-fidel) +data Identity : name [Unicode ^ ..0xff] + , email [Std.Ascii#aloha-lunar-felix ^ ..0xff] + , suite IdSuite + , pk [Byte ^ ..0xff] + +@mnemonic(delta-star-element) +data Iface : version VerNo + , name StrictTypes.TypeName#jamaica-capsule-chance + , inherits {IfaceId ^ ..0xff} + , globalState {StrictTypes.FieldName -> ^ ..0xff GlobalIface} + , assignments {StrictTypes.FieldName -> ^ ..0xff AssignIface} + , valencies {StrictTypes.FieldName -> ^ ..0xff ValencyIface} + , genesis GenesisIface + , transitions {StrictTypes.FieldName -> ^ ..0xff TransitionIface} + , extensions {StrictTypes.FieldName -> ^ ..0xff ExtensionIface} + , defaultOperation StrictTypes.FieldName#orient-spell-talent? + , errors {StrictTypes.Variant -> ^ ..0xff [Unicode ^ ..0xff]} + , types RGB.Types#titanic-front-courage + +@mnemonic(vendor-polite-gong) +data IfaceId : [Byte ^ 32] + +@mnemonic(everest-analyze-native) +data IfaceImpl : version VerNo + , schemaId RGB.SchemaId#garcia-smoke-ozone + , ifaceId IfaceId + , globalState {NamedFieldGlobalStateType ^ ..0xff} + , assignments {NamedFieldAssignmentType ^ ..0xff} + , valencies {NamedFieldValencyType ^ ..0xff} + , transitions {NamedTypeTransitionType ^ ..0xff} + , extensions {NamedFieldExtensionType ^ ..0xff} + , script RGB.Script#import-scorpio-evening + +@mnemonic(electra-scale-joel) +data IfacePair : iface Iface, iimpl IfaceImpl + +@mnemonic(monday-igloo-jupiter) +data ImplId : [Byte ^ 32] + +@mnemonic(natural-spain-alfred) +data IndexedBundle : RGB.ContractId#alarm-danube-vampire, RGB.BundleId#desert-divide-visible + +@mnemonic(pedro-isabel-printer) +data NamedFieldAssignmentType : id RGB.AssignmentType#hunter-hello-retro + , name StrictTypes.FieldName#orient-spell-talent + , reserved CommitVerify.ReservedBytes4#claudia-drink-digital + +@mnemonic(slogan-mama-product) +data NamedFieldExtensionType : id RGB.ExtensionType#mission-salsa-parole + , name StrictTypes.FieldName#orient-spell-talent + , reserved CommitVerify.ReservedBytes4#claudia-drink-digital + +@mnemonic(nuclear-origin-member) +data NamedFieldGlobalStateType : id RGB.GlobalStateType#seminar-major-tape + , name StrictTypes.FieldName#orient-spell-talent + , reserved CommitVerify.ReservedBytes4#claudia-drink-digital + +@mnemonic(caravan-buzzer-cockpit) +data NamedFieldValencyType : id RGB.ValencyType#palma-exit-pupil + , name StrictTypes.FieldName#orient-spell-talent + , reserved CommitVerify.ReservedBytes4#claudia-drink-digital + +@mnemonic(tower-factor-gabriel) +data NamedTypeTransitionType : id RGB.TransitionType#puma-joshua-evita + , name StrictTypes.FieldName#orient-spell-talent + , reserved CommitVerify.ReservedBytes04#dollar-falcon-analyze + +@mnemonic(contact-remote-popular) +data OwnedIface : any () + | rights () + | amount () + | anyData () + | anyAttach () + | data StrictTypes.SemId#cargo-plasma-catalog + +@mnemonic(office-hexagon-exile) +data OwnedStateSuppl : meaning [Unicode ^ ..0xff], velocity VelocityHint + +@mnemonic(lecture-karma-miami) +data SchemaIfaces : schema RGB.SchemaSchema#apropos-broken-soprano, iimpls {IfaceId -> ^ ..0xff IfaceImpl} + +@mnemonic(maxwell-denver-stretch) +data Stock : hoard Hoard + , history {RGB.ContractId -> ^ ..0xff RGB.ContractHistory#civil-basic-nevada} + , bundleOpIndex {RGB.OpId -> ^ ..0xffffff IndexedBundle} + , anchorBundleIndex {RGB.BundleId -> ^ ..0xffffff RGB.XChainTxid#cubic-museum-lemon} + , contractIndex {RGB.ContractId -> ^ ..0xff ContractIndex} + , terminalIndex {RGB.XChainSecretSeal -> ^ ..0xffffff RGB.Opout#india-joshua-adam} + , sealSecrets {RGB.XChainBlindSealTxPtr#prime-loyal-escort ^ ..0xffffff} + +@mnemonic(partner-austin-dinner) +data SupplId : [Byte ^ 32] + +@mnemonic(mayor-judo-rival) +data Terminal : seals {RGB.XChainTerminalSeal#bread-tarzan-touch}, witnessTx RGB.XChainTx#roger-crater-escort? + +@mnemonic(battery-cecilia-politic) +data TerminalSeal : concealedUtxo BPCore.SecretSeal#santana-domingo-needle + | witnessVout VoutSeal + +@mnemonic(emerald-profit-jasmine) +data TickerSuppl : absent () + | global (RGB.GlobalStateType#seminar-major-tape, StrictTypes.Path#exotic-western-courage) + | owned (RGB.AssignmentType#hunter-hello-retro, StrictTypes.Path#exotic-western-courage) + +@mnemonic(oxygen-oliver-rubber) +data TransitionIface : optional Std.Bool#laser-madam-maxwell + , metadata StrictTypes.SemId#cargo-plasma-catalog? + , globals {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , inputs {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , assignments {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences#unicorn-empire-mama} + , valencies {StrictTypes.FieldName#orient-spell-talent ^ ..0xff} + , errors {U8 ^ ..0xff} + , defaultAssignment StrictTypes.FieldName#orient-spell-talent? + +@mnemonic(input-tripod-oscar) +data ValencyIface : required Std.Bool#laser-madam-maxwell + +@mnemonic(textile-politic-harris) +data VelocityHint : unspecified | seldom#15 | episodic#31 | regular#63 + | frequent#127 | highFrequency#255 + + +@mnemonic(sabine-harlem-absorb) +data VerNo : v0 | v1 + + +@mnemonic(concert-venice-jacket) +data VoutSeal : method BPCore.Method#trilogy-tahiti-valid + , vout Bitcoin.Vout#chrome-robin-gallop + , blinding U64 + + diff --git a/Transfer.vesper b/Transfer.vesper index e746f386..281af016 100644 --- a/Transfer.vesper +++ b/Transfer.vesper @@ -1067,6 +1067,8 @@ Consignmenttrue rec iface rec Iface version enum VerNo v0=0 v1=1 name ascii len=1..100 aka=TypeName aka=Ident charset=AlphaNumLodash + inherits set len=0..MAX8 + element bytes len=32 aka=IfaceId globalState map len=0..MAX8 key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash value rec GlobalIface @@ -1090,7 +1092,6 @@ Consignmenttrue rec key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash value rec ValencyIface required enum Bool false=0 true=1 - multiple enum Bool false=0 true=1 genesis rec GenesisIface some bytes len=32 option wrapped aka=SemId tag=1 globals map len=0..MAX8 @@ -1103,11 +1104,8 @@ Consignmenttrue rec value rec Occurrences min is U16 max is U16 - valencies map len=0..MAX8 - key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash - value rec Occurrences - min is U16 - max is U16 + valencies set len=0..MAX8 + element ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash errors set len=0..MAX8 element is U8 transitions map len=0..MAX8 @@ -1130,11 +1128,8 @@ Consignmenttrue rec value rec Occurrences min is U16 max is U16 - valencies map len=0..MAX8 - key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash - value rec Occurrences - min is U16 - max is U16 + valencies set len=0..MAX8 + element ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash errors set len=0..MAX8 element is U8 some ascii len=1..100 option wrapped aka=FieldName aka=Ident charset=AlphaNumLodash tag=1 @@ -1147,23 +1142,18 @@ Consignmenttrue rec value rec Occurrences min is U16 max is U16 - redeems map len=0..MAX8 - key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash - value rec Occurrences - min is U16 - max is U16 assignments map len=0..MAX8 key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash value rec Occurrences min is U16 max is U16 - valencies map len=0..MAX8 - key ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash - value rec Occurrences - min is U16 - max is U16 + redeems set len=0..MAX8 + element ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash + valencies set len=0..MAX8 + element ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash errors set len=0..MAX8 element is U8 + some ascii len=1..100 option wrapped aka=FieldName aka=Ident charset=AlphaNumLodash tag=1 some ascii len=1..100 option wrapped aka=FieldName aka=Ident charset=AlphaNumLodash tag=1 errors map len=0..MAX8 key rec Variant diff --git a/src/interface/contractum.rs b/src/interface/contractum.rs index f51b5426..9abf6b6f 100644 --- a/src/interface/contractum.rs +++ b/src/interface/contractum.rs @@ -19,15 +19,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::collections::HashMap; use std::fmt; use std::fmt::{Display, Formatter}; use amplify::confinement::{TinyOrdMap, TinyOrdSet, TinyString}; use rgb::Occurrences; -use strict_encoding::{FieldName, Variant}; +use strict_encoding::{FieldName, TypeName, Variant}; use strict_types::{SemId, SymbolicSys}; -use crate::interface::{ArgMap, ExtensionIface, GenesisIface, Iface, OwnedIface, TransitionIface}; +use crate::interface::{ + ArgMap, ExtensionIface, GenesisIface, Iface, IfaceId, OwnedIface, TransitionIface, +}; struct ArgMapDisplay<'a>(&'a ArgMap); @@ -146,11 +149,22 @@ impl<'a> Display for OpIfaceDisplay<'a> { pub struct IfaceDisplay<'a> { iface: &'a Iface, + externals: HashMap, types: &'a SymbolicSys, } impl<'a> IfaceDisplay<'a> { - pub fn new(iface: &'a Iface, types: &'a SymbolicSys) -> Self { Self { iface, types } } + pub fn new( + iface: &'a Iface, + externals: HashMap, + types: &'a SymbolicSys, + ) -> Self { + Self { + iface, + types, + externals, + } + } } impl<'a> Display for IfaceDisplay<'a> { @@ -171,7 +185,20 @@ impl<'a> Display for IfaceDisplay<'a> { } writeln!(f, "@version({})", self.iface.version)?; - writeln!(f, "interface {}", self.iface.name)?; + write!(f, "interface {}", self.iface.name)?; + if !self.externals.is_empty() { + f.write_str(": ")?; + for (index, id) in self.iface.inherits.iter().enumerate() { + if index > 0 { + f.write_str(", ")?; + } + match self.externals.get(id) { + Some(name) => write!(f, "{name}")?, + None => writeln!(f, "{id:-}")?, + } + } + } + writeln!(f)?; for (fname, g) in &self.iface.global_state { write!(f, "\tglobal {fname}")?; diff --git a/src/interface/iface.rs b/src/interface/iface.rs index d0f39fc2..e268fc36 100644 --- a/src/interface/iface.rs +++ b/src/interface/iface.rs @@ -20,6 +20,7 @@ // limitations under the License. use std::cmp::Ordering; +use std::collections::HashMap; use std::fmt::{self, Display, Formatter}; use std::str::FromStr; @@ -293,6 +294,7 @@ pub struct TransitionIface { pub struct Iface { pub version: VerNo, pub name: TypeName, + pub inherits: TinyOrdSet, pub global_state: TinyOrdMap, pub assignments: TinyOrdMap, pub valencies: TinyOrdMap, @@ -323,8 +325,12 @@ impl Iface { #[inline] pub fn iface_id(&self) -> IfaceId { self.commit_id() } - pub fn display<'a>(&'a self, sys: &'a SymbolicSys) -> IfaceDisplay<'a> { - IfaceDisplay::new(self, sys) + pub fn display<'a>( + &'a self, + externals: HashMap, + sys: &'a SymbolicSys, + ) -> IfaceDisplay<'a> { + IfaceDisplay::new(self, externals, sys) } pub fn check(&self) -> Result<(), Vec> { @@ -469,6 +475,13 @@ impl Iface { } } + // TODO: Implement checking interface inheritance. + /* + pub fn check_inheritance<'a>(&self, ifaces: impl IntoIterator) -> Result<(), Vec> { + // check for the depth + } + */ + // TODO: Implement checking types against presence in a type system. /* pub fn check_types(&self, sys: &SymbolicSys) -> Result<(), Vec> { diff --git a/src/interface/rgb20.rs b/src/interface/rgb20.rs index 4add5ebd..51eae8a3 100644 --- a/src/interface/rgb20.rs +++ b/src/interface/rgb20.rs @@ -57,6 +57,7 @@ fn rgb20() -> Iface { Iface { version: VerNo::V1, name: tn!("RGB20"), + inherits: none!(), global_state: tiny_bmap! { fname!("spec") => GlobalIface::required(types.get("RGBContract.AssetSpec")), fname!("terms") => GlobalIface::required(types.get("RGBContract.AssetTerms")), @@ -299,9 +300,9 @@ impl From for Rgb20 { impl IfaceWrapper for Rgb20 { const IFACE_NAME: &'static str = LIB_NAME_RGB20; const IFACE_ID: IfaceId = IfaceId::from_array([ - 0x28, 0x75, 0xde, 0xa6, 0x57, 0x6e, 0x80, 0x25, 0x11, 0x0a, 0x35, 0x2d, 0x7c, 0x75, 0x9e, - 0x8a, 0x3c, 0x9c, 0xbf, 0x7b, 0xa8, 0xa0, 0x26, 0x12, 0x80, 0x2a, 0x46, 0x47, 0x25, 0xce, - 0xff, 0x75, + 0x7f, 0x5d, 0xce, 0x04, 0xba, 0x54, 0xd5, 0xbd, 0x2c, 0xa0, 0x60, 0x5d, 0xf5, 0x9b, 0x82, + 0x71, 0xd7, 0xb1, 0x41, 0x26, 0x45, 0xde, 0xbb, 0x22, 0xbe, 0x4d, 0x0a, 0x54, 0x99, 0xfc, + 0x12, 0x1e, ]); } diff --git a/src/interface/rgb21.rs b/src/interface/rgb21.rs index 75020de2..aea24f89 100644 --- a/src/interface/rgb21.rs +++ b/src/interface/rgb21.rs @@ -347,6 +347,7 @@ fn rgb21() -> Iface { Iface { version: VerNo::V1, name: tn!("RGB21"), + inherits: none!(), global_state: tiny_bmap! { fname!("spec") => GlobalIface::required(types.get("RGBContract.AssetSpec")), fname!("terms") => GlobalIface::required(types.get("RGBContract.AssetTerms")), @@ -510,9 +511,9 @@ impl From for Rgb21 { impl IfaceWrapper for Rgb21 { const IFACE_NAME: &'static str = LIB_NAME_RGB21; const IFACE_ID: IfaceId = IfaceId::from_array([ - 0x2a, 0x94, 0x0a, 0xfa, 0x8e, 0xa1, 0xed, 0x40, 0x2c, 0x38, 0x69, 0x1d, 0x2c, 0x1a, 0xc2, - 0xed, 0x72, 0x90, 0xca, 0x41, 0xe2, 0xbe, 0x6a, 0x1f, 0x8a, 0x2b, 0xf2, 0xff, 0x41, 0xf2, - 0x9e, 0xac, + 0x52, 0xb6, 0x07, 0x7c, 0x68, 0x5b, 0xa2, 0xf7, 0xbc, 0x5a, 0x62, 0x37, 0x05, 0x01, 0xc5, + 0xfb, 0xcf, 0xc3, 0x62, 0x3b, 0xbf, 0x1d, 0xb8, 0x7a, 0x1f, 0x97, 0x77, 0x1f, 0xed, 0x62, + 0xfc, 0x94, ]); } diff --git a/src/interface/rgb25.rs b/src/interface/rgb25.rs index 563c2988..3dcbac89 100644 --- a/src/interface/rgb25.rs +++ b/src/interface/rgb25.rs @@ -56,6 +56,7 @@ fn rgb25() -> Iface { Iface { version: VerNo::V1, name: tn!("RGB25"), + inherits: none!(), global_state: tiny_bmap! { fname!("name") => GlobalIface::required(types.get("RGBContract.Name")), fname!("details") => GlobalIface::optional(types.get("RGBContract.Details")), @@ -165,9 +166,9 @@ impl From for Rgb25 { impl IfaceWrapper for Rgb25 { const IFACE_NAME: &'static str = LIB_NAME_RGB25; const IFACE_ID: IfaceId = IfaceId::from_array([ - 0x5d, 0x36, 0x8e, 0x75, 0xa8, 0x2e, 0x15, 0x81, 0x3c, 0x12, 0x39, 0x6b, 0x0e, 0x2b, 0xc0, - 0x8b, 0xe9, 0x66, 0x82, 0x3f, 0x9e, 0x10, 0x18, 0x8d, 0xf1, 0xd6, 0xfb, 0x24, 0x9b, 0x28, - 0x28, 0xa5, + 0x48, 0x77, 0xa2, 0xee, 0x52, 0x4c, 0x84, 0x95, 0xc6, 0x13, 0xd0, 0xcb, 0x6f, 0xb3, 0x4a, + 0xcd, 0xd7, 0x7a, 0x2a, 0x67, 0xbc, 0x04, 0x89, 0x2c, 0xe8, 0x2f, 0x6f, 0x70, 0x0e, 0x47, + 0x7c, 0x82, ]); } diff --git a/src/stl/stl.rs b/src/stl/stl.rs index 43feabba..fdc14aa1 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -42,7 +42,7 @@ pub const LIB_ID_RGB_CONTRACT: &str = /// Strict types id for the library representing of RGB StdLib data types. pub const LIB_ID_RGB_STD: &str = - "urn:ubideco:stl:GAmGeUnZ6CzKRHEPT9jMN6ijNoCHVmnQCwrHzksPv9VK#ralph-phoenix-capitan"; + "urn:ubideco:stl:CBYcrv2NR6MTaDpoe7sjz39FV9fJ5TzKNzMQ1NnZTZBy#number-weekend-october"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { diff --git a/stl/Cargo.toml b/stl/Cargo.toml index 8b8f347c..801bf9f5 100644 --- a/stl/Cargo.toml +++ b/stl/Cargo.toml @@ -17,6 +17,7 @@ name = "rgb-stl" path = "src/main.rs" [dependencies] +amplify = { workspace = true } strict_types = { workspace = true } commit_verify = { workspace = true } rgb-std = { version = "0.11.0-beta.4", path = ".." } diff --git a/stl/src/main.rs b/stl/src/main.rs index 9b33fa88..d42ce08e 100644 --- a/stl/src/main.rs +++ b/stl/src/main.rs @@ -20,6 +20,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[macro_use] +extern crate amplify; + use std::fs; use std::io::Write; @@ -145,13 +148,13 @@ fn main() { .expect("not all libraries present"); let rgb20 = Rgb20::iface(); - fs::write(format!("{dir}/RGB20.con"), format!("{}", rgb20.display(&ifsys))).unwrap(); + fs::write(format!("{dir}/RGB20.con"), format!("{}", rgb20.display(none!(), &ifsys))).unwrap(); let rgb21 = Rgb21::iface(); - fs::write(format!("{dir}/RGB21.con"), format!("{}", rgb21.display(&ifsys))).unwrap(); + fs::write(format!("{dir}/RGB21.con"), format!("{}", rgb21.display(none!(), &ifsys))).unwrap(); let rgb25 = Rgb25::iface(); - fs::write(format!("{dir}/RGB25.con"), format!("{}", rgb25.display(&ifsys))).unwrap(); + fs::write(format!("{dir}/RGB25.con"), format!("{}", rgb25.display(none!(), &ifsys))).unwrap(); let mut file = fs::File::create(format!("{dir}/Transfer.vesper")).unwrap(); writeln!(