From b98699c3797165de2d6142348f78f3177e6adc5b Mon Sep 17 00:00:00 2001 From: vineyardbovines Date: Fri, 26 Jun 2026 10:57:26 -0400 Subject: [PATCH] feat(bskyweb): match Pass Designer pass.json + assets literally --- bskyweb/cmd/bskyweb/passdata.go | 123 ++++++++---------- .../bskyweb/testdata/pass-dawn.golden.json | 57 ++------ .../cmd/bskyweb/testdata/pass-day.golden.json | 57 ++------ .../bskyweb/testdata/pass-dusk.golden.json | 57 ++------ .../bskyweb/testdata/pass-night.golden.json | 57 ++------ bskyweb/static/passes/icon@2x.png | Bin 0 -> 1585 bytes bskyweb/static/passes/icon@3x.png | Bin 0 -> 2278 bytes bskyweb/static/passes/logo@2x.png | Bin 4671 -> 4155 bytes bskyweb/static/passes/logo@3x.png | Bin 7210 -> 6419 bytes 9 files changed, 108 insertions(+), 243 deletions(-) create mode 100644 bskyweb/static/passes/icon@2x.png create mode 100644 bskyweb/static/passes/icon@3x.png diff --git a/bskyweb/cmd/bskyweb/passdata.go b/bskyweb/cmd/bskyweb/passdata.go index 3fbb28b605..55dd2519c6 100644 --- a/bskyweb/cmd/bskyweb/passdata.go +++ b/bskyweb/cmd/bskyweb/passdata.go @@ -30,30 +30,32 @@ func ThemeBackgroundRGB(theme string) string { } type passField struct { - Key string `json:"key"` - Label string `json:"label"` - Value string `json:"value"` - DateStyle string `json:"dateStyle,omitempty"` + Key string `json:"key"` + Label string `json:"label"` + Value string `json:"value"` + DateStyle string `json:"dateStyle,omitempty"` + TextAlignment string `json:"textAlignment,omitempty"` } -// passFields is the iOS <= 26 storeCard/generic layout: header, primary, -// secondary, back. -type passFields struct { +// genericFields is the iOS <= 26 fallback layout that Pass Designer produces +// in the `generic` block. Notably no backFields - Pass Designer omits that +// key in this block. +type genericFields struct { HeaderFields []passField `json:"headerFields"` PrimaryFields []passField `json:"primaryFields"` SecondaryFields []passField `json:"secondaryFields"` - BackFields []passField `json:"backFields"` } -// posterFields is the iOS 27 layout used by Pass Designer. Adds auxiliary -// and footer field slots that the classic layout does not have. +// posterFields is the iOS 27+ layout in the `posterGeneric` block. All six +// field slots present, empty arrays where not used (matches Pass Designer's +// output literally). type posterFields struct { + AuxiliaryFields []passField `json:"auxiliaryFields"` + BackFields []passField `json:"backFields"` + FooterFields []passField `json:"footerFields"` HeaderFields []passField `json:"headerFields"` PrimaryFields []passField `json:"primaryFields"` SecondaryFields []passField `json:"secondaryFields"` - AuxiliaryFields []passField `json:"auxiliaryFields"` - FooterFields []passField `json:"footerFields"` - BackFields []passField `json:"backFields"` } type barcode struct { @@ -64,62 +66,46 @@ type barcode struct { } type pkPass struct { - FormatVersion int `json:"formatVersion"` - PassTypeIdentifier string `json:"passTypeIdentifier"` - SerialNumber string `json:"serialNumber"` - TeamIdentifier string `json:"teamIdentifier"` - OrganizationName string `json:"organizationName"` - Description string `json:"description"` - LogoText string `json:"logoText"` - ForegroundColor string `json:"foregroundColor"` - LabelColor string `json:"labelColor"` - BackgroundColor string `json:"backgroundColor"` - Generic passFields `json:"generic"` - PosterGeneric posterFields `json:"posterGeneric"` - SuppressHeaderDarkening bool `json:"suppressHeaderDarkening"` - UseAutomaticColors bool `json:"useAutomaticColors"` - Barcodes []barcode `json:"barcodes"` + FormatVersion int `json:"formatVersion"` + PassTypeIdentifier string `json:"passTypeIdentifier"` + SerialNumber string `json:"serialNumber"` + TeamIdentifier string `json:"teamIdentifier"` + OrganizationName string `json:"organizationName"` + Description string `json:"description"` + ForegroundColor string `json:"foregroundColor"` + LabelColor string `json:"labelColor"` + BackgroundColor string `json:"backgroundColor"` + Generic genericFields `json:"generic"` + PosterGeneric posterFields `json:"posterGeneric"` + SuppressHeaderDarkening bool `json:"suppressHeaderDarkening"` + UseAutomaticColors bool `json:"useAutomaticColors"` + Barcodes []barcode `json:"barcodes"` } const passTypeIdentifier = "pass.xyz.blueskyweb.app" -// BuildPassJSON builds the pkpass JSON for both the iOS <= 26 fallback layout -// (`generic` block) and the iOS 27 layout (`posterGeneric` block). The two -// blocks describe the same fields in the layouts each iOS version expects: -// the user sees the poster layout on iOS 27+ and the legacy layout below that. +// BuildPassJSON builds the pkpass JSON matching the Pass Designer-exported +// layout literally: `generic` has handle (primary) + member-since (secondary); +// `posterGeneric` adds DID as a footer field and stacks handle + member-since +// in primaryFields. // -// pdsHost is the hostname extracted from the user's DID document -// serviceEndpoint (e.g. "suillus.us-west.host.bsky.network"). -// createdAt is the user's profile record creation time, used as a rough -// stand-in for account creation. +// pdsHost and displayName are currently unused - the design landed without +// them - but their plumbing is retained in callers for a possible future +// design. The token still carries pdsHost. func BuildPassJSON(did, handle, displayName, pdsHost, theme, teamID string, createdAt time.Time) ([]byte, error) { + _ = displayName + _ = pdsHost + _ = theme theme = CoerceTheme(theme) profileURL := "https://bsky.app/profile/" + handle - atHandle := "@" + handle - memberName := displayName - if memberName == "" { - memberName = atHandle - } - if pdsHost == "" { - pdsHost = "bsky.social" - } createdAtISO := "" if !createdAt.IsZero() { createdAtISO = createdAt.UTC().Format(time.RFC3339) } - // avoid an unused variable when displayName is empty - we keep memberName - // computed for a possible future design, but the current layout uses - // handle directly. - _ = memberName - - pdsField := passField{Key: "pds", Label: "PDS", Value: pdsHost} handleField := passField{Key: "handle", Label: "Handle", Value: handle} sinceField := passField{Key: "since", Label: "Member Since", Value: createdAtISO, DateStyle: "PKDateStyleShort"} - backFields := []passField{ - {Key: "about", Label: "About", Value: "Scan the QR code to view this Bluesky profile."}, - {Key: "url", Label: "Profile URL", Value: profileURL}, - } + didField := passField{Key: "did", Label: "DID", Value: did, TextAlignment: "PKTextAlignmentNatural"} p := pkPass{ FormatVersion: 1, @@ -127,29 +113,24 @@ func BuildPassJSON(did, handle, displayName, pdsHost, theme, teamID string, crea SerialNumber: did + "-" + theme + "-v1", TeamIdentifier: teamID, OrganizationName: "Bluesky", - Description: "Bluesky profile - " + atHandle, - // logoText omitted - the logo image already carries the "Bluesky" - // wordmark; setting both would render the brand name twice. - LogoText: "", - ForegroundColor: "rgb(255, 255, 255)", - LabelColor: "rgb(255, 255, 255)", - BackgroundColor: ThemeBackgroundRGB(theme), - // iOS <= 26 fallback: handle as primary, since as secondary (stacked). - Generic: passFields{ - HeaderFields: []passField{pdsField}, + Description: "Atmosphere Account", + ForegroundColor: "rgb(255,255,255)", + LabelColor: "rgb(255,255,255)", + // Matches Pass Designer's exported backgroundColor. Theme parameter + // kept in the signature for the URL/serial but no longer affects color. + BackgroundColor: "rgb(44,103,244)", + Generic: genericFields{ + HeaderFields: []passField{}, PrimaryFields: []passField{handleField}, SecondaryFields: []passField{sinceField}, - BackFields: backFields, }, - // iOS 27+: handle and since side-by-side in primaryFields, matching - // what Pass Designer exports. PosterGeneric: posterFields{ - HeaderFields: []passField{pdsField}, + AuxiliaryFields: []passField{}, + BackFields: []passField{}, + FooterFields: []passField{didField}, + HeaderFields: []passField{}, PrimaryFields: []passField{handleField, sinceField}, SecondaryFields: []passField{}, - AuxiliaryFields: []passField{}, - FooterFields: []passField{}, - BackFields: backFields, }, SuppressHeaderDarkening: false, UseAutomaticColors: false, diff --git a/bskyweb/cmd/bskyweb/testdata/pass-dawn.golden.json b/bskyweb/cmd/bskyweb/testdata/pass-dawn.golden.json index 2ec0fb3f3c..6e3433be47 100644 --- a/bskyweb/cmd/bskyweb/testdata/pass-dawn.golden.json +++ b/bskyweb/cmd/bskyweb/testdata/pass-dawn.golden.json @@ -4,19 +4,12 @@ "serialNumber": "did:plc:abc123-dawn-v1", "teamIdentifier": "TEAMID00", "organizationName": "Bluesky", - "description": "Bluesky profile - @alice.bsky.social", - "logoText": "", - "foregroundColor": "rgb(255, 255, 255)", - "labelColor": "rgb(255, 255, 255)", - "backgroundColor": "rgb(255, 109, 190)", + "description": "Atmosphere Account", + "foregroundColor": "rgb(255,255,255)", + "labelColor": "rgb(255,255,255)", + "backgroundColor": "rgb(44,103,244)", "generic": { - "headerFields": [ - { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" - } - ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -31,28 +24,20 @@ "value": "2026-01-25T23:59:05Z", "dateStyle": "PKDateStyleShort" } - ], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } ] }, "posterGeneric": { - "headerFields": [ + "auxiliaryFields": [], + "backFields": [], + "footerFields": [ { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" + "key": "did", + "label": "DID", + "value": "did:plc:abc123", + "textAlignment": "PKTextAlignmentNatural" } ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -66,21 +51,7 @@ "dateStyle": "PKDateStyleShort" } ], - "secondaryFields": [], - "auxiliaryFields": [], - "footerFields": [], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } - ] + "secondaryFields": [] }, "suppressHeaderDarkening": false, "useAutomaticColors": false, diff --git a/bskyweb/cmd/bskyweb/testdata/pass-day.golden.json b/bskyweb/cmd/bskyweb/testdata/pass-day.golden.json index 90e10a7bfe..a8b22f9787 100644 --- a/bskyweb/cmd/bskyweb/testdata/pass-day.golden.json +++ b/bskyweb/cmd/bskyweb/testdata/pass-day.golden.json @@ -4,19 +4,12 @@ "serialNumber": "did:plc:abc123-day-v1", "teamIdentifier": "TEAMID00", "organizationName": "Bluesky", - "description": "Bluesky profile - @alice.bsky.social", - "logoText": "", - "foregroundColor": "rgb(255, 255, 255)", - "labelColor": "rgb(255, 255, 255)", - "backgroundColor": "rgb(117, 175, 255)", + "description": "Atmosphere Account", + "foregroundColor": "rgb(255,255,255)", + "labelColor": "rgb(255,255,255)", + "backgroundColor": "rgb(44,103,244)", "generic": { - "headerFields": [ - { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" - } - ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -31,28 +24,20 @@ "value": "2026-01-25T23:59:05Z", "dateStyle": "PKDateStyleShort" } - ], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } ] }, "posterGeneric": { - "headerFields": [ + "auxiliaryFields": [], + "backFields": [], + "footerFields": [ { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" + "key": "did", + "label": "DID", + "value": "did:plc:abc123", + "textAlignment": "PKTextAlignmentNatural" } ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -66,21 +51,7 @@ "dateStyle": "PKDateStyleShort" } ], - "secondaryFields": [], - "auxiliaryFields": [], - "footerFields": [], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } - ] + "secondaryFields": [] }, "suppressHeaderDarkening": false, "useAutomaticColors": false, diff --git a/bskyweb/cmd/bskyweb/testdata/pass-dusk.golden.json b/bskyweb/cmd/bskyweb/testdata/pass-dusk.golden.json index cdda0b2bf6..f194c19ce3 100644 --- a/bskyweb/cmd/bskyweb/testdata/pass-dusk.golden.json +++ b/bskyweb/cmd/bskyweb/testdata/pass-dusk.golden.json @@ -4,19 +4,12 @@ "serialNumber": "did:plc:abc123-dusk-v1", "teamIdentifier": "TEAMID00", "organizationName": "Bluesky", - "description": "Bluesky profile - @alice.bsky.social", - "logoText": "", - "foregroundColor": "rgb(255, 255, 255)", - "labelColor": "rgb(255, 255, 255)", - "backgroundColor": "rgb(177, 90, 162)", + "description": "Atmosphere Account", + "foregroundColor": "rgb(255,255,255)", + "labelColor": "rgb(255,255,255)", + "backgroundColor": "rgb(44,103,244)", "generic": { - "headerFields": [ - { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" - } - ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -31,28 +24,20 @@ "value": "2026-01-25T23:59:05Z", "dateStyle": "PKDateStyleShort" } - ], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } ] }, "posterGeneric": { - "headerFields": [ + "auxiliaryFields": [], + "backFields": [], + "footerFields": [ { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" + "key": "did", + "label": "DID", + "value": "did:plc:abc123", + "textAlignment": "PKTextAlignmentNatural" } ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -66,21 +51,7 @@ "dateStyle": "PKDateStyleShort" } ], - "secondaryFields": [], - "auxiliaryFields": [], - "footerFields": [], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } - ] + "secondaryFields": [] }, "suppressHeaderDarkening": false, "useAutomaticColors": false, diff --git a/bskyweb/cmd/bskyweb/testdata/pass-night.golden.json b/bskyweb/cmd/bskyweb/testdata/pass-night.golden.json index e3d9686618..70858031ba 100644 --- a/bskyweb/cmd/bskyweb/testdata/pass-night.golden.json +++ b/bskyweb/cmd/bskyweb/testdata/pass-night.golden.json @@ -4,19 +4,12 @@ "serialNumber": "did:plc:abc123-night-v1", "teamIdentifier": "TEAMID00", "organizationName": "Bluesky", - "description": "Bluesky profile - @alice.bsky.social", - "logoText": "", - "foregroundColor": "rgb(255, 255, 255)", - "labelColor": "rgb(255, 255, 255)", - "backgroundColor": "rgb(0, 21, 51)", + "description": "Atmosphere Account", + "foregroundColor": "rgb(255,255,255)", + "labelColor": "rgb(255,255,255)", + "backgroundColor": "rgb(44,103,244)", "generic": { - "headerFields": [ - { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" - } - ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -31,28 +24,20 @@ "value": "2026-01-25T23:59:05Z", "dateStyle": "PKDateStyleShort" } - ], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } ] }, "posterGeneric": { - "headerFields": [ + "auxiliaryFields": [], + "backFields": [], + "footerFields": [ { - "key": "pds", - "label": "PDS", - "value": "alice.host.bsky.network" + "key": "did", + "label": "DID", + "value": "did:plc:abc123", + "textAlignment": "PKTextAlignmentNatural" } ], + "headerFields": [], "primaryFields": [ { "key": "handle", @@ -66,21 +51,7 @@ "dateStyle": "PKDateStyleShort" } ], - "secondaryFields": [], - "auxiliaryFields": [], - "footerFields": [], - "backFields": [ - { - "key": "about", - "label": "About", - "value": "Scan the QR code to view this Bluesky profile." - }, - { - "key": "url", - "label": "Profile URL", - "value": "https://bsky.app/profile/alice.bsky.social" - } - ] + "secondaryFields": [] }, "suppressHeaderDarkening": false, "useAutomaticColors": false, diff --git a/bskyweb/static/passes/icon@2x.png b/bskyweb/static/passes/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..35e0da14715c250cdd866e7dbf2c2cabfa499fd0 GIT binary patch literal 1585 zcmV-12G043P)fm_AT}bqOKs`LEIIXSwYmtIE~P`09jGL1b;wKs=jkp2ecU59k1y3N{%`R9fj<5b4Ibha7iyCK_e`+Y`Vbm#MycdVbtJ-uBLX%!J(h-hP# zs{2V^is8z(3&(r@X1wXF#90&c@Hi5&o}-LdL}MW5eUwjVfNg``bdS4|Vv#<+Vi3uL zpHYoie%^~{Z?G+#=(lO;>7xn~Jx&68Nd#D`!c zoM`^UA|jabA{c33G{0go8%TUvSVnBRb335*3)^^La;z90i6oKx44*LN_$K2u-`txq zVf_?o6B>Uv-Ak@(XyA23V6Q!ZZxp^Th9zi+p^PeiLDSgr>=13B@tK*v<AY;6NYA>OIQRcHGJ%^}Z|*OArFq zsLHse&9`EN!FXajiR&g@UDLYa5aCGpD-$f_gsq!vT2~B*%3GL>kr0w1*RW6=mJq* zuwExD%%XGd_n<$m zjHN|`YUN=k`eQ?@UACFAxZ;b&7gtv+xYi3D>IB+nEV=2?s(+}Bryc7dy41b5!$>S^ zZ6RQ@V1&aHX572(qU;UX>7~od*B|Bz$9UgmT&K*M*f1sH=3$NN+T@@GLS?uMmdA?6 zHSV$e{Aga&X`;zek$oH^EJ<3n>dX7-r|)ZG3V~DnC0=vuDpHmVFKgqL0 zbjJc|K{w#AuP1*SShQSEFk0Far|6bQ>*0nBZGw8`a#l6Lw!I^$v6H3ztkJPPm9y@) zy4SQjS?;PV!768A$C~x20d@&m+dFmSdbqoVaofqRiA88_C)&AC=_XjH#UE`!(Hv*s z-CVLurjh|7o)d zx~Z6FQw$#;*2vWrGpbcwU+F73vze`Y{F0D&>Z#MQP0q+OefeDtP?Bov^ld{;eBwzu z%kIW^6Kk4q%~2JxNcD{k)|BgtR_^O(>^7fgs3+R_rkU*`>g@!fXpy;r1m&2R^Qz3= z@SLcUr6p;bL)4)D)*1FNQ+XrWE%7rki&j!$5;fQ6SlVRVOB~M_Nl*K}yEuRjXshld)%PS+XTXU)4;J$&m5rw_2@Ms|6$y zi9{liNJNZi{mq+l8<)tDVO#%PV1|$48xrI3rp$4rG^p6bHyn#u(_5E?d{yqC#DRM3 zp!t8CD^b7VK2Fsil}OlwguBEu)yAa3L-oq`(tD`=OMF(H>SXcdI{W1(^}L6!wEWRT zPhOQzR6D+I?L18g9OHv{JO8obW%*A1p*Ju?s>e|hv?u%Jo_an|j~pfloG3A$^FQZ* z@Dqk3)y?o0e~42g+Tr2r-HrJiMuuIy7w46b-(h-JG(mUDJ=H_g7`g~MknhlE_*w@I zZy&_2P$JS@aRK{CBy&55dSRihUJl!+UYYe8VEd7S%=LbGfV&R)9|g|fLPX*k52;6f zQU81bmk2fgxre8B&eXn8(}@jrGrQ|7j2g-^^_0UkG^k&yJCf!}cLfqLQ{UOOh=lqK zGOanrfhM~bH)C?#(0G_>zaz&;WN3;WxPw0HLX8>E5G(ZEcsv}lUGof6P^#(4Z>4GQ z!C&^v*ZR9nz%)VNFbXmGI~-yX7E90omRk~y7LL}E6b zX{|%!N{C|eHBV+vYs_dKDd7VoW=K;Ly4HytnzoB4<_jIzIDj+R4u^D%sxDH9C)u$dwxsL*zp!&yTrcJ0zT&++3?o6S!9cZ{4`aEac|s1EYy$GhzY8ARbz2IGQ%ligL`Fs zMVqM9YK`T3t^4J_@N1`0Vi~DIa}Vk-G-U|aSWV?#~9_Tuy}%L^-oVG}l48XGIxv*@nz6v@Q;#7qr)yKTR07m@=6Z;|kW z49{1UNnM@S%GHn4csV^sc)z+%yg(OTs>Rwex)4_waIycj8*RG@N$|1|?NQ8;7z3%z z>3ebB<;~r<3{X;2p$6Mh$72(2IaQ9$qpl(n-Fsx6b;m9x%%DKH(Bt7bdSWJI1qphs zR@?>Rt%&TNnJ(UMC}71fAuIS`5?Zuw_I3Z$r5; zn@Y@UB`Td_An*&8#g%%UkWV?NR$D?`b(!6yCC+pXji`MG{&}Xe-AeVI4fWuo10^iu zM#wg(=U#!zV?I_7>cKhULf(vXU)Rn1Y%`9K>>NG25$~?7b+Y*s%F7=x_I1UbkUVZu z+6ZNS-}QxR3CHJzxe=0gIVAy?k#HoaT_Ihb$QBp9qBdQyR}8}SiEMF^>$b93$!mCz zq_L3d#HA>YDHM)-K6EZQOh^{-EM*c5gpXz19U|s1(|T#?oZ!0-wc(Fp%Y^1aa#i6y zBKHmHmXhnbJMzmge#0TQS}#+_Z;R3 z2Z^xKI=4+KdG#0aIyf(tb}faqpT(e!`wJ<8i=UpTZ+VW8FlggV#Etw}32VQUh}c03 zxA1N^>YG8M&i*qIQX&+#7EaI!XE%1)zc5FCA&X$fo5kE1GO;3%Yd5H9-Cs!F+#}&X z%bx13efORsJ6E`@VLC?oKHki9n&EBk>obvkpHmvOt(lO%Z%-F3xuX1<-#6iw*#X>U zLi*ky_f~ENJb|wWb!~<@ujbQ_EnU#vzh1enG5mFU8KJ`kv?tv+i!y`MCIONN8q>pJTy{V5d$fQ;b7m`eDp{q?y zJ6`s66nL&S^{R-}l{zeJ>ai1RiSQxle8F%(53W=R15VG0hwWvL=}x z8pej&XxAiy(}vyEk150)>L~E`w=qqubrA{s%UE+UCEPaSI(kbSR461PVa2X zJ(KDO9CfK&HI#8uJtzWHSm>P;jd3X=K|Pb^#bV&`8GNme#t@M|ZfwkoEsb_(FTjVP z^~rz+c0QD|pIP9|O(pvh~V6NYDf^8ZsR_}~g+R}iWKD-~p2fu#zx zs=#su+Eierg56XgrGiB&kW;~gBY+mQCUGG_66C(mIXJrTe!*~V7!Uyf0000000000 z0000004yD5J}cX0*>+`n;ujvu_O)#5vMB;V*!wB>?5=Ew+C6=;_jpYJfawvzW;TD80Y0k@Ehm2mmk&Z)iM3fb8a^363rN z008460#MU<%ti=KB>Xf107hd>4X{E4%2&!CXnp`J91(z1_~c~FY_>zc?72-L{4@ao zMq?@gD98wu>{4Xd;?>`Tf2#w^CsM%$+I`T2r2^Q~Cqh%wfEyJkbOI7?nx@=B#;Kr^pYq`^dRG zza{{{sN}8z3gWX%Q90(T-4_4=JoA(NnfoAoDW7#&`p7yBSF=S9aDDKX`Bi_q_L z-MaSk@3K9X&tOlHSU1Ke$0}Fle(woPPQW{JzNAcrN&srgA2EgRV{g7SeK(XpLyQ9! zjaN~3)bT&c`>D$x`?B3cJPY4>Kr_#WzVFPen1cyi(bW{rHRa`)xkP{!nLyIc29*Gq zEprHh)G1=3!q)UvG!Hb*3stteoa#9O5X+o2z>1)#uw7?PL*3?@11R+zF9?7cGB*uS z2sMSTX1hb+(C&*Nt zuq%ohe0(ztd{kuXg0KSeoct#GF9g8MsB3_8oR8vDDe!J9EpUc`kBYx3W2}qh3%Q39 zDoTufo`qwT$B>d~)<5YA)aWh=-ge&wnZ#lF0G!c_-&vFCQ~R#_b{tcVQP|`D|LC~i z=p}J|KZR?>&avZ5z<<8y0nbLbk0}&lgK{pP^pEe2q?hnK`CPk(JDw+l2<>veJI`^8 zh#{v@7zZ}*rlKB{+l%je$8j7uB40CL z|H`wyvd8qDld5gwyN?A0!U69o*Ct@Ao4|XTCztl370q`-^F7Uj#0879(MZKkYL%z z2DAL$v&{zz$G7e)VS79=`WKofYl8MSG``8}eP8ieV};*_(jXd*cPdsZ{6wSbBXH|H zYiL7gg7*ISG_{+iq8HXjsvX;@h;uGH%U>P;SODG<7@Hf)9Q$&w9jk0pJNk2ijSp=@ zX$cwD8Jf{h1wM4Zx?RWAw-Weq5aH)qr?(kweTA-%#ScNDR|3#RS{D5!&x~!ZrG?ly z`Y){SY2#Q`Oy4V7C|2|ExmTp$$cIeQh2EC!ec3*eU%S8dXf|tdvnS(E`?+jyrP<^A zKB`43Q`q`MH=fn*J;G1edzOco!9F4Bmu=SJ8XDaK{ZKR@93L@^<(30{Sv=z?Fq>$v z3-PNd$M(MLirbd$3g25Hd7vVOFwE= z+BVVJd-)YP%s;8g+@H{Q5eRwkI$YAtpht?8&^?OBZ~V zd8Zt!+=O&)+n?Ij3rPfSB4p&vZ)8kjF_Bl5nOwH_3En>m;wZ=RrgRq{ThDUWeJaRJ z;|Jr7V*|N)nm}qa8UN5+k(W@C&mY)h{w)BP-$`37D-@T;)}*=k1gn_1PT!;mXAwZD zwRARv4}3nvkFgexU4QRb}-#AX@S%MRUU`oXFIA1NtY?MxL;N=!Yb#-!0 zacIY~UmO0nCqEm08D%2A#)5`NBFLAXbsE!M0{PRi%#{vPv~TttY;5dvKRGt4#(+vh zOH_DY9vE;VFT}^pgrE3&b;~j_%@i3^s~|Vh5&vCvoU|%qTmtYpNI_}%!H*{INxAzy z`R~1=nxE31(xYwSQwtg|9YNt)?n`&^u_gDIbFn~Py=UxCe`yt}P5~&`4lC-m+(en# zOA(0SIYlB<;Se-Xzvl2(j@7QY!=zQY!s8ZrZ9A5@N**XaVDZkjwfwn}VyqtAT!f!o zm%QYE)qW@Y^V?GVU6E*Vf8=uTo%P0cLYJ@?f9I&_Ot!DB<#(%iC^7;-0#)*N%>588 za7*3seF$Y3v1cVJ2p6*~Ih=(N4Pv@h{f5t;s)RwsT<23O83UuzkU8YSzhi#1b;zkxvd>TieY^49OJp{SI10xes&e)G=EvsQ9{@fjzjM0~6iuTFUWJ-Uf2Q<})}n#Fpo@%2-jez1%kdS3`N2YtFV6UD$FXPVtBz?^DY@+dcx1 zgZDu;Usu!({E=3TWNdi&dVt5Mmhid3)uFKy1g^1WxEgy;gTX@e_g~T)-)uHqNzTz5Q03e0NgmvqmKX# z6+kZT*nKZ{p8MFP6NYl(IIge2XCD-GduLS7=M>#9IR5#o(0xZofjRv|ElWi1P4LWL z3*e8{K=lo+N$ra^y3jqhuO{v3wT~8jRZ}FIn=-0iah2Lc3>+yWbcqVbjDm?8@7yH~ zCUl~fQ%BK!r|OL1#tx4h3>!i0IutBPXSV`Ar4aO1O-VQwxX#sTpt0#znBRL=6W7^i zio>_hI#KUQlmO&;Pd+{cm&}XJ72KCCMP=b2tdNZnK%$YHuey&!XgY@tnQ`!%x}(XQ z*Cu4;gkypCWS-X`!mmb1jew|v2`m4!nRWIQL97NC?ZgC&_+V%<5yLH+`7NZx`uS?) zanCgYKAV^gVWFNTMH+q@DE&9BUijc^)>%dLx#~tN)#hAj8E~1bR zz@M?&{wii=HZxIW5#c;SlRGRvB@&W~An-lqD+Gr~WdPtLU^C3L z@T}Hp>~HW;xPba-Q}LztyHxKeC@;RH_WuB|RM?Cbkpc*sUWPRmp3R)|ek6m(A6gZH zs-0iR;Q6uH5da_v?j~c_)R9;d_%F(fS6Say)7n#Bj8m2efSJQ4&QMSs+f|R!{;>jZ z=p@QmnsS4N7_!ud;Z<`0mcd2j`kH$7_t;tCa?-GLljOI-kX(Fj+tq0lN(CSVA0pP> z(-fuW*p$J_fwkitebqYMz^quwjOvoHUZ~2r51Q#Ob`x0_H-Vi#bzwx z6mzZknUsYG z04x+9PY5cCgvXn|WJ3Ue(}af?f}JC(Y-Z>hk_`a>P8&8;^bMhH^&WvD`{4A*wXO*O z00cHB=YiAll@h^e{ecJ0Wd2_OKt`|;f?Mv7>?2tk3!D7KkO`c9oYIt+0DvyAF^Lb{ zjll{paCd(tOkMy$9BhIRhd?2-SW000000000000000004l_{0F}+Z5Gcl07d`+002ovPDHLk FV1jD(+XMgr literal 4671 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