Changes which may break some users are marked below with: ⚠️
Language
File attributes such as @experiment(...) and @extern(embed) are now honored between the package clause and the import declarations, where the spec allows them, rather than being silently ignored or rejected (#2371).
Evaluator
⚠️ Closedness now follows what a reference denotes rather than where it is evaluated. A reference which reaches into a definition from outside now closes the value it selects even when it is evaluated inside that definition, such as outside.s below, which was previously accepted. Conversely, a definition which refers to a regular struct no longer rejects a field which a sibling reference in that struct supplies, fixing a regression introduced in v0.18.0-alpha.3 (#4501).
outside: #Out
let Out = {s: {a: 1}, u: outside.s & {b: 2}} // error: field not allowed
#Out: Out
#P: {a?: int}
x: {q: {}, s: #P & q & {a: 3}}
#L: {v: x} // no longer rejects a
Disjuncts which differ only in constraints that can never apply, such as [...int] & [] and [...string] & [], or only in whether they were closed by close or by a definition, are deduplicated again, so that such a disjunction resolves rather than staying ambiguous. A disjunction whose disjuncts carry the same data but different constraints now gives the same result whichever disjunct comes first (#4503).
Errors in a value which is only reachable through a hidden field, a let, or an imported package are now reported by cue vet and cue.Value.Validate, where they were skipped.
cmd/cue
cue vet now checks every data file, and every document of a stream, against the schema and reports all of their errors, rather than stopping at the first one which fails to unify (#2511). cue eval likewise carries on past a failing data file, honoring --out and -i, and no longer writes its --outfile once any error has been reported.
Incomplete errors, such as missing required fields, are now reported alongside other errors when the input is a package too, as v0.18.0-alpha.3 already did for individual files (#3358).
cue eval --ignore --concrete now shows non-concrete values and reference cycles as errors in its output, as documented, rather than printing them as their expressions (#2342). The cue.Concrete option to cue.Value.Syntax behaves the same way.
cue fmt now keeps the source's line breaks between consecutive import declarations, as gofmt does, rather than forcing a blank line after each (#1545).
A number of formatting regressions compared with the old formatter have been fixed, most of them involving comments. Comments inside index brackets, after a unary operator, before an operand, before the closing brace of a struct, after a call argument, in an interpolation, in a pattern label, or between the clauses of a comprehension are now kept in place rather than dropped or moved where they swallowed the code which followed. Blank lines between comprehension clauses are kept, parentheses grouping a right-nested disjunction are kept, fields sharing a line are no longer padded to align with the rows around them, and the Compact option no longer drops comments.
cue def output of a file which enables aliasv2 in a module below language version v0.18.0 is now valid, keeping the @experiment attribute ahead of a package clause added via -p (#4434).
tool/exec.Run now fills stderr whether or not stdout is captured and whether or not the command succeeds, and fills either field with bytes when it is constrained to that type.
Modules
A ./... pattern now matches packages when the current directory is reached through a symbolic link.
Concurrent cue processes no longer fail to read logins.json on Windows while another one is updating it.
LSP server
Go-to-definition in a file reached through a symbolic link now reports the file which was actually imported. In a file shared by several packages, go-to-definition, find references, and rename no longer silently return nothing after an edit elsewhere in one of those packages.
The language server is more robust against clients: a workspace folder keeps working when the client does not support configuration requests or fails one, rather than crashing on the next edit, and requests sent before initialization or after shutdown are rejected as the protocol describes rather than crashing the server.
As always, the language server is under active development: please report any bugs or missing features you encounter via the Issue tracker or via the #lsp channels on Discord or Slack. See our Getting Started wiki page for instructions on how to set it up with your editor.
Encodings
The YAML encoder introduced in v0.18.0-alpha.1 fixes a number of regressions compared with the old one, and now documents the rules it follows: its output is valid YAML 1.2 which decodes back to the same value. Strings which go-yaml decoders such as the one used by Kubernetes would read as numbers, like 0X1F, and strings starting with --- or ... are quoted; strings with characters such as a no-break space no longer gain literal backslash escapes; strings consisting of only newlines, or with leading newlines before an indented line, no longer lose content; keys longer than 1024 characters are written in explicit form; comments on a flow collection stay outside of its brackets; and number literals are written only in the core schema's forms.
A @yaml tag can now be given to a list element or an embedded value via a declaration attribute, as in {"x", @yaml(,tag="!Env")}, and tags are written as valid YAML tags, reporting an error for a tag such as Env which is neither local nor a URI (#4269).
cue get go now emits an embedded Go struct as a spread embedding, #Embedded..., in modules at language version v0.18.0 or later, so that the generated definition keeps its own fields under strict embedding. Invalid flags are now reported before the Go packages are loaded, and loading is faster as function bodies are no longer type-checked.
Standard library
list.Sum, list.Product, list.Avg, list.Min, and list.Max once again compute over the elements present in an open list, as len and comprehensions do, undoing the change announced in v0.18.0-alpha.3 which reported any open list as incomplete (#2569).
list.Sort, list.SortStable, and list.IsSorted no longer panic on a comparator whose less field comes from a comprehension, an embedding, or a unification (#3063), and now report a comparator which lacks x or y or whose less is not a boolean as an error, which list.IsSorted used to drop.
⚠️ uuid.ToInt now decodes the 128-bit value of its UUID, as documented, rather than converting the bytes of its string form, so its results change. Any form accepted by uuid.Parse yields the same value, which round-trips through uuid.FromInt.
math.Pow now returns 1 for a zero exponent with any base, including zero, as documented (#4506).
The Windows functions of path now follow Go's path/filepath in handling UNC paths such as \\host\share, cleaning the result of path.Rel, and no longer turning a relative path into one with a volume name.
Go API
cue.Attribute.Kind now reports the kind of the attribute rather than zero for every attribute.
In cue/ast/astutil, Apply now updates references when any node is replaced, so that Sanitize no longer binds references to a replaced alias expression with a spurious let; Cursor.Modified reports a change to the last element of a list or call; and Cursor.Replace moves the comments of the old node to the new one rather than leaving both holding them, which printed each comment twice.
Syntax trees produced by exporting a value, such as via cue.Value.Syntax, no longer share nodes with the syntax from which the value was built, so that editing or formatting the result in place no longer alters later exports. Likewise, cue/load no longer modifies a syntax tree given as an overlay via FromFile when injecting tag values, and injects each tag value once into a file shared by several instances.
cue.Context.Encode now encodes a nil pointer of any type as null, including types implementing json.Marshaler or error, rather than panicking. cuego.Validate and cuego.Complete now report an error for a nil value rather than panicking while holding the package's lock, which left every later call blocked.
A tools/flow task returning ErrAbort no longer fails the whole flow: its results are dropped and the tasks depending on it are terminated with its error, as documented.
Full list of changes since v0.18.0-alpha.3
- internal/lsp/server: skip non-file workspace folders by @mvdan in 1264dce0a47b36988a1bfdb0ab06849dac3a030a
- cmd/cue/cmd/integration: test virtual workspace folders by @mvdan in bca271573d6aaaafbd6a4f6b66120e48f9510182
- internal/encoding: make all tests external by @mvdan in 9805b026263ced6fad2d1280f7fb22758ee3a9f0
- internal/pretty: make all tests external by @mvdan in c2ceb60bb25cfa1a2e2b29849c4c780cd352791c
- tools/flow: make all tests external by @mvdan in 3c79091c889b9bfb865736cbdb93e43ffa4d784f
- internal/lsp: drop the gopls settings and Go file kinds by @mvdan in 3a27370b05c17969313eb8b3a7bc04859e83ae5c
- internal/golangorgx/gopls/test/integration: drop Go-specific editor config by @mvdan in a6f2291e58a31f920dba921b25a25ee5126e9b13
- pkg/math: make Pow return one for a zero exponent by @mvdan in 1521072d4ba657b6d2167566550e910dcf4115a7
- pkg/math: add Pow test cases with a zero base and exponent by @mvdan in d1515f1a26277ee0d66a14b0f6b71156c5496588
- all: move in-package tests to external test packages where possible by @mvdan in 543eeebd890497340911791592b8de70d246f377
- cue/testdata: document the base line of relative pos= specs by @mvdan in 67ff6bb2db2c659e6f7b57d55cdbdcd5d0db01c4
- internal/cuetxtar: scope @test(skip) to its path by @mvdan in 8c4e49028e7f520e5a331e046bfc380d86a4d59e
- encoding/jsonschema: drop the unused brokenRoundTrip test tag by @mvdan in 7bfff5419051b408113d1b22813ee4bf287f7ad2
- encoding/jsonschema: verify more extracted schemas in TestDecode by @mvdan in b89315079a3b813761f650159e0d11435859f82d
- cue/testdata: run the issue3599 inline assertions by @mvdan in af19f488e9aa2d188e17c670922ab7a855cbd82c
- internal/core/adt: run validate no-sharing cases by @mvdan in b613411db2d9a74e9f913f186a3e1a40ff24703f
- internal/core/adt: remove TestEvalV2 by @mvdan in 8f718a83b799d017a907d8f0e50f9dd6e1db7112
- internal/core/export: drop test skip entries matching no test by @mvdan in beff5a2ccb425e67d340ffb4bcf7c45154158888
- internal/core/dep: enable the inline test with evalv3 by @mvdan in 77ff9ed09f77b52c8439c5d7ccdaec8cc26e8131
- internal/core/subsume: merge TestStructural into TestValues by @mvdan in 749f1840b468064b006ebab7718bc2dd1df094d6
- cmd/cue/cmd: make TestVersion cacheable by go test by @mvdan in 35c6882046019de611f198c1002661093b5e7270
- internal/ci: update to Go 1.27.2 and goreleaser v2.18.3 by @mvdan in 7f1a1abc1f7c99efad257ce5acdad81012fa831f
- internal/core/adt: detect re-instantiation of an inline struct with the same arguments by @mpvl in 52b5141d87f3c403e2744eb5168f41918ddff70b
- internal/core/adt: deduplicate disjuncts equal but for vacuous constraints by @mpvl in c216d8769ffb03c787b95824fe8dec3d3d8a38dd
- cue/testdata: test disjunctions whose disjuncts carry the same data by @mvdan in 053010ad5b383e71107470c05346af8beec52f9a
- internal/lsp/cache: copy comment groups with ast.Clone by @mvdan in 5779f170785b50bca6daab7355dcfe45f60c31ad
- internal/lsp/fscache: parse a file separately for each path it is read as by @mvdan in 95c5403a44e00195a5d54acdafb5d1d43b9879da
- internal/lsp/fscache: add a test for definitions in a symlinked file by @mvdan in cb7a601ef61172a033fa42b470a7de15c1f285ac
- internal/lsp/cache: map positions from any parse of a shared file by @mvdan in 85d1e740261f5eef0b204ba8b1a6360b624d8aaa
- internal/lsp/cache: add a test for files shared by two packages by @mvdan in 9609e1d88303ccc5ca7026910cf5257d8b574b37
- internal/lsp/server: keep a workspace folder usable without client configuration by @mvdan in dddc7c363e27a33902b1c1fad8ecbd088629926c
- internal/lsp/server: add a test for a failing workspace configuration fetch by @mvdan in 6e7dd140dd2907ca21459d35284d623b5851f8f8
- internal/lsp/server: reject messages outside the initialized state by @mvdan in 965575ea7f505a48f970db221ddd98b3711fcb7b
- internal/lsp/server: add a test for messages outside the initialized state by @mvdan in a7d7c7a94ba302de7f693090c9ac873967cab0c0
- internal/mod/mvs: keep only the requirement graph by @mvdan in c398b51db85347ee1acfd235d8232228e1bb7a53
- pkg: remove the qgo tool by @mvdan in 8e25c5634ea46280421140f5760d8bbce076512f
- internal/core/adt: reject float slice indices by @mvdan in 897fba42cd435ddc24f46163d41dd9ec97985618
- internal/core/adt: test float slice indices by @mvdan in f3ab27a66d09d55cf4712426f2fe1d26263e6f27
- pkg/time: compute ToUnixNano without overflowing by @mvdan in db312888c4c4e961ee3f02f58cc0791022daea9f
- pkg/time: test ToUnixNano with times beyond 64 bits of nanoseconds by @mvdan in 960369128ab792bf6792b08193ac78e09f1ab516
- internal/pkg: reject integer arguments beyond the range of their Go type by @mvdan in d75066e57cb334e3119f2ffc0ff7a6df32549e2e
- pkg: test integer arguments beyond the range of their Go type by @mvdan in 1269c9517cba247d01de2096e478c711c154b43a
- internal/golangorgx: remove gopls/util/safetoken by @mvdan in 58049af3965104c8a818fff9330ea78bc97a02e7
- internal/golangorgx: remove the empty gopls/hooks package by @mvdan in 82138b0b5494230617281da6acee0ec542e94211
- internal/golangorgx: remove the event package tree by @mvdan in 378f8cdee391108b46888be3c3b894cafe9bc943
- internal/golangorgx: remove unused packages by @mvdan in 7fa5fc5d0ce8a5ac76aafd5166686b49defbf8e6
- cue/format: keep the source layout between import declarations by @mvdan in aeddc511ad3ca816e433304b9145d92dd01e651e
- cue/format: add a test for consecutive import declarations by @mvdan in 7b16e4f0f741a956fb1082e2b9d5d54b8816a786
- internal/core/subsume: account for patterns and ellipses of closed values by @mvdan in e7067f84bd3fa824dd33a5a922d876269631df04
- internal/core/subsume: test closed structs with patterns and open lists by @mvdan in d98853bd2de9c80b51cfc0d23b208e4eb6f67ad6
- cue/token: lock the line tables in File.unpack by @mvdan in bf22460e839d134e325933ef6f79740976f7dc64
- cue/parser: recover from a malformed import path by @mvdan in 264fa3f556c8d78bf42cad3bda6deace413de944
- cue/parser: test import declarations with a malformed path by @mvdan in 1f645a1d2adb1e9ba8e34729d2104deffee6f626
- cue/parser: do not consume a closing token after a missing selector by @mvdan in d2547782b0a90ef0fb6a2840861b3186fb270a10
- cue/parser: test a missing selector before a closing token by @mvdan in 48c999c7b6cabce3112d723e02f82eb29805dd40
- cue/load: clean a trailing slash before a qualifier or version by @mvdan in f4d6ab9bd253301e39089d96d6580af07381f540
- cue/load: test a trailing slash before a qualifier or version by @mvdan in 15e31e6eb02b53abb64b94c268a70b4983a871fe
- cue/load: follow a symlink at the root of a ./... pattern by @mvdan in 09f5f3c74a90d12304a41ed795a708de924f26e1
- cmd/cue: test ./... from a directory reached through a symlink by @mvdan in 826d457606ac8e1551862b5999d205b475873af0
- specs/ae566: specify, plan, implement and review editor syntax support by @cuematthew in de9aad0a5fb05ebc4bd47d3b0d122cc91ef78ef9
- cue/parser: add a syntax corpus for editor tooling by @cuematthew in 9442002159b4a9aa51d5717ae86cf0d9082043d8
- cmd/cue: report errors in CUE_DEBUG by @mvdan in e811b5ed47af58ce93c970c9bb9ffc1f32ff7178
- cmd/cue: add a test for CUE_DEBUG errors being ignored by @mvdan in bb054878c267d59ce175c3100612eea752d6379f
- internal/cueexperiment: remove IsPreview and ShouldRemoveAttribute by @mvdan in 93cd0b00e9c219fdb06188505cb2febf6de38310
- internal/{cuedebug,cueexperiment}: drop stale envflag-era comments by @mvdan in e9299225fbb5999e3d4102541c6607d0a3a342db
- internal/cuedebug: fold in internal/envflag by @mvdan in 094071af76a0296dcd8da276ddb0b0f4bd8bb44d
- internal/core/eval: remove in favor of adt.NewContext by @mvdan in 018c1090b440fe1a0535a10d255059394759617c
- internal/core/runtime: absorb internal/types by @mvdan in 4dfe2a52987e5b8ad33a946dbda463344486dc81
- internal/encoding: fold in internal/valuecodec by @mvdan in 912a804445c4202ed245d6b14f88e7b70298d8a8
- pkg/tool: remove the pkg/internal helper package by @mvdan in 129b0b0f1bbd19d713dd42ebf792fb09d4d640e7
- internal/mod/modimports: fold in internal/cueimports by @mvdan in 89725fd3a38fb88bd768886eb6422eb23ea87e37
- cue/errors: inline the Printer interface and remove internal/core/format by @mvdan in 148d55c77a4053f2534d785dd9e7f2748ffb241b
- internal/filetypes: fix FileInfo aspect comments by @mvdan in 4712cae17962a45e7941a01fafb7469d70345fdf
- internal/filetypes: fold the internal package into filetypes by @mvdan in 99f7b1a31d440c16a04a41dcea469987bbcd98d6
- update protocompile to its master by @mvdan in 3aedba88841b68b65ea8539447b34a71dc18c844
- update go-digest to its latest master by @mvdan in 0c11398ec9167f00cf12bdcb9560a11e02016196
- update all dependencies to latest by @mvdan in 3848c4ada938725a2c632c7a783b047a7fb9e300
- pkg/path: clean the result of Rel by @mvdan in eef3bea4d15148255389b75f6588a67b49eceef8
- pkg/path: test Rel results which are not clean by @mvdan in 258bc93fc82a422352e7fe34a3fe6f02fc6a496e
- pkg/path: make Windows Rel handle bare UNC shares by @mvdan in 5e5fa0d89b4826ad41bda886afce8344c6feeb03
- pkg/path: test Windows Rel with bare UNC shares by @mvdan in 5246c4e269774ce27aa2b0b68bc229d852538f88
- pkg/path: fix Windows IsAbs on UNC shares and reserved names by @mvdan in 11b19a5073a640b804502716232b55ebce3c8c71
- pkg/path: test Windows IsAbs on UNC shares and reserved names by @mvdan in 2d4ac576823039ecf26d5671cbab043f438e54ce
- pkg/path: stop Windows Clean from creating absolute paths by @mvdan in 18c4bfd187400ab023db6170db18de4ccc553a58
- pkg/path: test Windows Clean creating absolute paths by @mvdan in 159b75398e602b62b6944cbac8ee4ab87d74f1cd
- pkg/path: parse Windows volume names as Go does by @mvdan in 537f2cb5995d689c83930bf02ec45ee9a08bede2
- pkg/path: test Windows volume name parsing by @mvdan in 8bd1d04ec04164df027dfb0467a3c8cf9c1e4b70
- cue/parser: limit the nesting depth of iterative parsing by @mvdan in 37b573b2700c7270882c3a329ee3a874d1f2822e
- cue/parser: test the nesting depth limit with iterative parsing by @mvdan in fab7ffd5df06bbc4f668385fabdd4e08f7b3128a
- pkg/tool/http: send Serve response trailers as trailers by @mvdan in c8b7fba73edae91addfab83157920ce26be2a12c
- pkg/tool/http: test response trailers in Serve by @mvdan in 5cb9e4dd3e10bf2c4ba6e71bb41aa38181601f07
- pkg/tool/http: fill request trailers in Serve by @mvdan in b688748089e528aa6ed39bb0fb78acb499466ba2
- cmd/cue: test request trailers in http.Serve by @mvdan in b88bf5036c89986eca4c8df5c27320277a7d073e
- pkg/tool/exec: capture output as bytes when stdout or stderr is bytes by @mvdan in aee89416d12a23a556fb8cfb82b47240ebe50e91
- cmd/cue: test exec.Run capturing output as bytes by @mvdan in 40f84e2969d249a502d3e6ec94d0327300146fd2
- pkg/tool/exec: capture stderr even when stdout is not captured by @mvdan in 861036f4bdd32ef958cca0dff64e09ed2e12a7f7
- cmd/cue: test exec.Run capturing stderr alone by @mvdan in d3b6fb328ada27a7d454fbe590dcb04b7dd5efe8
- pkg/tool/os: fix environment variable task docs by @mvdan in 2f32696df647de046e2276ad1746131d5e2d2692
- pkg/tool: fix the Name doc comment by @mvdan in 5050145e7821271a4843244d4799681eaa74a5f6
- pkg/regexp: drop the unreachable "no named groups" error by @mvdan in d8d4ba9f4d9d757bd9127b072bfa599905df0399
- pkg/math: reject infinities and NaN when rounding to integers by @mvdan in 87cc1ff4de1ac68b0e74fb0386be9f479473f2ae
- pkg/math: test rounding infinities and NaN to integers by @mvdan in 605564c35857c958a9892e582b6e46f9dfd1e949
- pkg/uuid: make ToInt decode the UUID's 128-bit value by @mvdan in 26b5d6559a66993443a77fb398656e116f23b08a
- pkg/uuid: add tests for ToInt by @mvdan in 8b84e9a7dd1efabb885028c29c46a15981dd31ed
- pkg/path: declare "windows" as the os default of VolumeName by @mvdan in af055c9d257d40d39e626833b02ccff3dcb388d2
- pkg: check the values of declared parameter defaults by @mvdan in 5ff4dfce48af43dde8ef7f1f4615c167f5e2d6ec
- encoding/openapi: deprecate Config.SelfContained, drop GenerateConfig.PkgName by @mvdan in 0eb5beebcd3a1d6f0de7a90fcfd0605214784177
- tools/flow: do not fail the flow when a task returns ErrAbort by @mvdan in 5e261adee0534999646f455e8c50208c837b1572
- tools/flow: add a test for tasks returning ErrAbort by @mvdan in aecdb01825c036d85a97b47ac68c643b3563102c
- cmd/cue: generate get go float constants held as binary floats by @mvdan in 8c5b462518c29319c7a4624e4103d60e924ca74d
- cmd/cue: test get go with float constants held as binary floats by @mvdan in 3fc995ba030cde9180eb94cbe9c84124bb0a6d35
- mod/modregistry: return nil from Module.Metadata without metadata by @mvdan in 1bcf119d1489bb6c27891a70579e8a0e87a76fc8
- mod/modregistry: test Module.Metadata without metadata annotations by @mvdan in a8215bd44a4566c056f5e479c4e534286cc17ea7
- cue: add a TODO about the Docs option ignoring its argument by @mvdan in 0514b3322d24cb286c1936bec7ad2a517bc872bd
- cue/token: ignore out of range first AddLineInfo by @mvdan in 7f808d419828203b95aedbf5dbcb77971d8238ba
- cue/token: add a test for out of range first AddLineInfo by @mvdan in d8434e9db2123f92be4e747b09ec09cacf77c0ef
- internal/core/adt: insert a disjunct value with all of its declarations by @mvdan in 710bd2fcf20fa6000243da23c786fa07c5a53f77
- cue/testdata: test close over a disjunction with optional fields by @mvdan in 73d27e9f6883ef458d47f1452006c10c818ac986
- internal/core/adt: decide definition crossing by where a reference resolves by @mvdan in c372d2e7dea6ee431b29fad0c05f06770b01ae61
- cue/testdata: test a sibling reference in a struct a definition refers to by @mvdan in 9559e39492bd6749288737e9520c57c9833fcbbf
- cmd/cue: load std once less in get_go_jsonv2 by @mvdan in 44098470b6e5ddb50151091d4e9672d6ea2ec615
- internal/cueexperiment: cache NewFile results by version by @mvdan in b74cb925012dbc69da44d7d32454e779c7295e20
- encoding/jsonschema: generate from the extracted schema value directly by @mvdan in 5a0fcdb03b62eedc63af9dbc38e10aea741bf5fb
- encoding/jsonschema: share a context between the schemas of a test file by @mvdan in e4d78bedcc3eec640a67ce23aad2a5dd138bcb72
- encoding/jsonschema: iterate over each schema's fields only once by @mvdan in d7bbda042f33b6f4243a7fa2203c189a26bc3057
- internal/filetypes: avoid go-cmp options in TestDriverMatchesCUE by @mvdan in ee5d191149b611a76d271360ff26bc6afc43080d
- internal/filetypes: cache oracle toFile results in TestDriverMatchesCUE by @mvdan in aad75026dad6462b03e6a10393479336697fd40c
- internal/cuetxtar: only parse eq bodies with shareID for shareID groups by @mvdan in f5ee445b10e62f4fc16c7e7040848c5bd6666d01
- internal/cuetxtar: build expected literals directly in cmpFinal by @mvdan in 0c6e34fe4e5b1993eb27ccb978ca02ab0d9d2596
- internal/cuetxtar: reuse the archive's context for permutations by @mvdan in b92db7499f268744a936e2dae7fdbb2aeb47fc2f
- cue: keep Value.Validate's doc to its intended behavior by @mvdan in 04f6613c39c27bbbb6e14a31bcf64b68837711b2
- cmd/cue: avoid loading encoding/json and fmt in get go tests by @mvdan in 1ef053a893add9fefef4ba0037e4b6f5b6e5568b
- internal/golangorgx/gopls/test/integration: format logged messages lazily by @mvdan in c7ee4595fed067b2bfc905be154560949b8b9875
- internal/golangorgx/gopls/test/integration: drop the Experimental mode by @mvdan in bfbd5f89783a5b8224d71fd5ade7c8253c62a2cf
- encoding/jsonschema: read the external tests with encoding/json by @mvdan in 1929f4d99dc2a935f47fa21f9130ac185eb32b0b
- encoding/jsonschema: only log TestExternal details on failure by @mvdan in ed671d3fb93b5358c520ae1a5586cbe4adbbe9d7
- encoding/jsonschema: do not run a subtest per test of failed schemas by @mvdan in 99db062cccb61fcc7e6010af5ab6b3ed8fcb7de5
- pkg/list: test Repeat with a count well below the limit by @mvdan in 13dc968477bdcbaef43b434de0cc386cf35d7689
- internal/cuetxtar: run inline archives in parallel by @mvdan in f9a670ef9654f8e50ff136fde77dacf693834dcd
- internal/cuetxtar: build @test(permute) orderings from the instance by @mvdan in aad1500eba8f2a24281fe4580b46dcaf05298a5f
- internal/cuetxtar: index @test records by path by @mvdan in e96bb343551b2e639f0f8daf37898d34dcffe3a4
- internal/core/export: run TestDefinition archives in parallel by @mvdan in 309bbbdf7b84eb1dd399fb46e3251340e733340b
- internal/cuetxtar: only format input files with CUE_FORMAT_TXTAR by @mvdan in 36ebe6c42502044afb365fabc4288b61dfcb100b
- internal/filetypes: share one oracle per mode in TestDriverMatchesCUE by @mvdan in cd6e78029cb68a8f0e28c897922b6a6877ccb48f
- internal/filetypes: evaluate the FromFile oracle as one expression by @mvdan in c0d4e7f5f2ac2d7b3cd40f296298a8a790585ee0
- internal/filetypes: cache tag values in TestDriverMatchesCUE by @mvdan in 818a3dc58306556f18b9ce43a32dac8413480a14
- cmd/cue: use a stub cuelang.org/go module in get_go_cue_value by @mvdan in 745e8cd6d45977cdeb6e87101a48deff0aa2342f
- cmd/cue: validate get go flags before loading packages by @mvdan in b5a3dfc1f31c6b46a236377df661d8469c231316
- cmd/cue: do not type-check function bodies in get go by @mvdan in 60e8f53b262e9e5f108c3ae188aa7cafe88c72b3
- internal/pretty: keep comments inside and before operands in place by @mvdan in 614bce7a352a27623e97f7103c803a3cf567e659
- cue/format: test comments inside and before operands by @mvdan in 636aef7a7606f35a5d59c9fcfa296102e50ad033
- internal/pretty: keep comments before the closer of a struct or call by @mvdan in 76891d31999fe4469d485a5f1a2155093d5230e3
- cue/format: test comments before the closer of a struct or call by @mvdan in 5dc3bbbdd61c9f4695e008daa42f50d67284c0ab
- internal/pretty: keep blank lines and comments between clauses in place by @mvdan in 0c27ce66e48e94be6a817d7753e54810e807b835
- cue/format: test blank lines and comments between comprehension clauses by @mvdan in 347f33a3690dd83c373c8be2372e0b171c1799ab
- internal/pretty: do not align rows sharing a line by @mvdan in abd1b306080de2323e29b6e0b23cd19dfdb6cae1
- internal/pretty: test padding of fields sharing a line by @mvdan in 38ac37288b84240cc0617f309648541af7488e57
- cue/format: keep comments and attributes when compacting or simplifying by @mvdan in c2bf6933841dcea1599ccd73064597798d3fc01b
- cue/format: test comments lost by Compact and Simplify by @mvdan in 0a36e3d64f58c8b2ac58a3ac6b9c0bdd42acd764
- internal/pretty: keep comments in interpolations and pattern labels by @mvdan in 6873fc2c5f98a862faa06ecde0d3687b5385c1cf
- cue/format: test comments in interpolations and pattern labels by @mvdan in 184162342a3a3eb62c3337584399ae1f0b5ffbe9
- internal/pretty: keep the grouping and comments of binary operands by @mvdan in b3863e6c2926c1180eafe7caf16cd48e9c121d59
- internal/pretty: test right-nested and commented binary operands by @mvdan in 7663b18193112ad37b83e116d03e56298c78ce1a
- internal/pretty: keep doc comments and line breaks in braceless chains by @mvdan in ef6b083b17788a9faa7f3bec9dd2086ee72c8a6f
- internal/pretty: test braceless chains with inner comments or breaks by @mvdan in cd851263bc6751888ad922bce80addd120e04fb7
- internal/pretty: break the line after a comment ending a row by @mvdan in d0940f9fc4f650302c7e1638337d5a1a7a203328
- cue/format: test comments ending list element and argument rows by @mvdan in 5e7ff73596a2b64686aa0707f8a4724a31938df6
- internal/tools: update x/tools for staticcheck on Go 1.27.2 by @mvdan in 90d878387aa3f19ecfc0b9d5ca7da2fe164900ea
- cmd/cue: drop Go directives from get go comments by @mvdan in f9b03dd53ad8197b9517486abfbbd6f5ef9831a6
- cmd/cue: test that get go copies Go directives into CUE comments by @mvdan in f0513424c8f275be2c30226f8ac53f2bcce9e7b3
- encoding/yaml: test valid YAML which the decoder rejects by @mvdan in b16c0d9b68d31ba1a55cc8f651aa2b8fc18a078b
- internal/encoding/yaml/goccy: test documents holding only comments by @mvdan in 62bca28f544d4537fa911df36b91b184b6e05522
- internal/encoding/yaml/goccy: test decoding CRLF line breaks by @mvdan in b18f1393a8a6a989e69f79be3038690338e5d116
- internal/encoding: keep file attributes first when adding a package clause by @mvdan in cce68aa383ea9e62fc1ffa27ff34cc646d5fb0fc
- cmd/cue: only spread embedded definitions in get go by @mvdan in 948dc5b6010eb0a6bc00ef82f2dc4286bc0681e5
- cmd/cue: report unreadable cue.mod directories in fix by @mvdan in 40ce5ad8154eeefbbf27761e8f737b6ade981111
- cmd/cue: avoid shadowing predeclared types in get go by @mvdan in b81fad5b540fb103b5ec6a1c57f56b0e2b65a82e
- cmd/cue: test get go with fields named like predeclared types by @mvdan in 7fd8f756d93130089ac25a75a1a75104c80f2508
- internal/core/export: honor experiments carried into the output by @mvdan in e34c4f554bf92a6a9d3b7b1583dd768b63bc0282
- cmd/cue: test def output of files enabling aliasv2 in older modules by @mvdan in 2bfb161cfefa7c4a26c4e80aefda51507285423a
- cmd/cue: open embedded definitions in get go since v0.18.0 by @mvdan in f850ae522ae0e20c21ef373f6e737ab39ffdd0e6
- cmd/cue: test get go embeds at language version v0.18.0 by @mvdan in 78f66abd300938a74533ce60cab96c2441dfbfd0
- cmd/cue: only fix cue.mod directories which contain CUE files by @mvdan in b2f8473c0c867e1a8824cf2405e80dc9ab5f00ab
- cmd/cue: test fix with no arguments and a nested cue.mod/gen tree by @mvdan in ace72bd58039782f76395eef59bebaf293ac5ed3
- internal/cueconfig: hold the logins.json lock while reading by @mvdan in 4e218742ca6201c4d9f6a2d81b29dd24c63ce8d5
- internal/cueconfig: test concurrent reads and writes of logins.json by @mvdan in 3bb389b541e34613a4b34bf3f1aab0d0fb953a35
- internal/core/adt: validate shared nodes within hidden fields by @mvdan in 3872ef0cecd312db48c11eb709ccea635ff0f06a
- internal/core/adt: add tests for errors in shared hidden fields by @mvdan in f12e0150c84192bbdd4865c006319ed1a217abe9
- cue: clarify what Value.Validate reports by @mvdan in 01f5c7ea22292b6f9f24dbb0488b6bc24c6dfc6b
- encoding/yaml: document how values are encoded and test round trips by @mvdan in c5d40faeb61d64d22eab545939e4cfe014841692
- internal/encoding/yaml/goccy: simplify the rendering of scalars by @mvdan in cd546f13562fb1b1e0e09f717589753f870ca6ba
- internal/encoding/yaml/goccy: keep comments outside of flow collections by @mvdan in 3a534c0f5c560d5944d0be3439bd713e21b9ac62
- internal/encoding/yaml/goccy: add a test for comments on flow collections by @mvdan in c48b36372d7fb63f78ef566a24c349137878ed7d
- internal/encoding/yaml/goccy: keep number literals only in core forms by @mvdan in d1de3c41f667c94ac897a1a2f49c27f09745628b
- internal/encoding/yaml/goccy: add a test for encoding number literals by @mvdan in 6b5644af796f928482fc0c4a5f75b876c162f09c
- internal/encoding/yaml/goccy: write keys over 1024 characters explicitly by @mvdan in d8d7418a536e5d45e5daf7d60f1b6d1f3eb480a8
- encoding/yaml: add tests for encoding keys longer than 1024 characters by @mvdan in f76d1d0367b93d03b69baa2fd072b6bce254bf37
- internal/encoding/yaml/goccy: quote strings which decoders misread by @mvdan in 1c62e831964c64c1048199d00569b25427440458
- encoding/yaml: add tests for strings which decoders misread by @mvdan in 6f6e2bfd87ca1711cc8ddf96d69e520eaa33b581
- internal/encoding/yaml/goccy: avoid literal blocks which lose content by @mvdan in aaf91c98c5f9a153bde7b5dde888ae121f8e15c1
- encoding/yaml: add tests for literal blocks which lose content by @mvdan in a0c11c96e09403e59754a155ea88a357e937c682
- internal/encoding/yaml/goccy: quote strings which need escapes correctly by @mvdan in f5d093381206ddd8c8916cac95846dc7d229bacd
- encoding/yaml: add tests for quoting strings which need escapes by @mvdan in d6364828abfa2ce0a4bd8ff79ae6656b99fdb72d
- internal/encoding/yaml/goccy: write @yaml tags as valid YAML tags by @mvdan in 2b3f351fe2455fbc39d6d5feb7cdfa36ea24ea07
- internal/encoding/yaml/goccy: add tests for writing invalid YAML tags by @mvdan in e62a66894341b7ce99e95f76a6e7927e775c8536
- doc/ref: state which closing operations are shallow and which recursive by @mvdan in 7c1d261eb17972c69f22683485e5b210dfdf8367
- cue/testdata: reword TODOs that still hold but describe the past by @mvdan in 783d33eaeb36a5bd284c04cb15ab6af8e9956bda
- cue/testdata: drop TODOs answered by later changes by @mvdan in 88149f31029816c77c4c0e8832f984b88d4610e3
- cue/testdata: convert TODOs the inline framework now supports by @mvdan in a3ec9ec178b799a8ce5fb02ef63cd5eea6ac8553
- internal/ci: reformat with cue fmt by @mvdan in 2bc3bdffb78634880c73dcc48f9d062a64f17272
- doc/ref: update the closedness example for strict embedding by @mvdan in de64291eadce24fd35c4dccb49cbbecbd72495b1
- internal/cuetxtar: run every allows assertion on a field by @mvdan in ea1455d5bae108fc7292e55ef9ee1c19c4b156ca
- internal/encoding/yaml/goccy: do not flow-quote an embedded scalar by @mvdan in 4014fb9ab9ae6ffd4ecf4c8d4e5b2a3ff5b70f4e
- internal/encoding/yaml/goccy: keep a tagged empty collection on one line by @mvdan in aa9a66e1c6473042f7e030b4201ddd7a726f5fa4
- internal/encoding/yaml: record known YAML tag issues as TODOs by @mvdan in 0e8b3cb552252de9887d27e0a112be2521defc7d
- internal/encoding/yaml: apply @yaml tags from declaration attributes by @mvdan in 096aa70e47543192cf55aec186351e55687c4db2
- internal/encoding/yaml: add tests for @yaml tags in declaration attributes by @mvdan in 92e2fedd41a3938f9ba479ed840e789aba12e4d2
- internal/ci: dispatch unity via the gh CLI rather than curl by @mvdan in 79e816902b7a57fa4aafb11769ef9b328ebe4626
- cue: make Attribute.Kind report the attribute's kind by @mvdan in 0c146bece161e598dd30e51bf4461d0c57e74217
- cue: test the kind reported by Attribute.Kind by @mvdan in 50c063bc49c064fb73c5591c3926f3609e445982
- encoding/jsonschema: do not generate nested open structs as constants by @mvdan in 6194cec1546e77e521916759bd623ea2ed361d55
- encoding/jsonschema: add tests for generating nested open structs by @mvdan in ff87c386949aa41558b093a1014ec7ff19fdb676
- private/internal/projection: ignore git stderr unless git fails by @mvdan in 03d47464c69d7716723570d36d5dc4ecffdd09ba
- private/internal/projection: test git warnings on stderr by @mvdan in 413b3b16c6c2a37a5bad5242bac673721040294b
- cue: report non-concrete values as errors in Syntax with Concrete by @mvdan in 02c395d426c0af8ac53f348910cd9b84572e7217
- cue: add tests for Concrete not reporting errors in Syntax by @mvdan in 40126c6d74fe0dd787e7755db9028bb5a196463a
- cmd/cue: drop the unused instance.err field by @mvdan in 3c7e0d18b2c7361b816073803503db80423a10c0
- cmd/cue: stop validating instances in buildInstances by @mvdan in e8c979427f3c9e2f4c439fb00af47dab4baa22bf
- cmd/cue: report incomplete errors alongside other errors in packages by @mvdan in 8a4826163cdb389cb93dac07838db05f94cc866f
- cmd/cue: test incomplete errors alongside other errors in packages by @mvdan in 5e84233c2fd10fb2d8a7622f682b06895b37420d
- internal/core/adt: key function call caches by the resolved vertex by @mvdan in c5333e4a4b2789e61b70eb3ca5ba1f92e8689eb7
- internal/core/adt: add tests for function calls across disjuncts by @mvdan in 14e4f17b8afe9880aec5680fb7d3d373de50a142
- encoding/yaml: validate values before encoding them by @mvdan in f3c721eab55cad1a32050c964965983dec0946c2
- encoding/yaml: add tests for encoding errors and non-concrete values by @mvdan in 92f871518700b5fb83da7009c7fddf03b95cb017
- internal/pretty: print a bare expression declaration's comments once by @mvdan in cd86cbc4c197642186b6017fac368fd475558af1
- internal/pretty: add a test for repeating a bare expression's comments by @mvdan in 6adbfc4ad30c72d93df93a5b581c32705d988e74
- pkg/list: fix panics on comparators with indirect or missing fields by @mvdan in 8e0ab6d68a4e693e167fc89337c680b922e5e18c
- pkg/list: add tests for comparators with indirect or missing fields by @mvdan in 3b93ad1f2f827a10d88b97d023fa5b437f54eb67
- pkg/list: report comparator errors in Sort and IsSorted by @mvdan in b315ae19385752ff162d750e139165fb4e236861
- pkg/list: add tests for comparator errors in Sort and IsSorted by @mvdan in c5a37c982d527acdfd88da3655f211f7131b401f
- cue/literal: reject number literals with an exponent out of range by @mvdan in 34c014c6d3c1d28928a5a1040701f8cf562a274d
- cue/literal: add tests for number literals with an exponent out of range by @mvdan in 9db78416ad09b907d24d74d4e43e50230efde910
- encoding/protobuf/textproto: report errors instead of panicking by @mvdan in a0a9ed92262a56c62bb7ab376849a669d5bf1d6d
- encoding/protobuf/textproto: add tests for decoder panics by @mvdan in b20603e5df8ffe48be787bcfc0b5d9118efce92b
- encoding/protobuf: treat an enum without values as empty by @mvdan in 64edd31dbc93d9fcf4a3aca203600cfa9eb777f0
- encoding/protobuf: add tests for enums without any values by @mvdan in c8bbb817949bb94be8d85adb106f6d32deddbf65
- encoding/xml/koala: reject documents without a root element by @mvdan in 9e2648782b38c6073c61453b612590405b100adb
- encoding/xml/koala: add tests for documents without a root element by @mvdan in 65fc9daca76736fb97dac97bde064377bd0149a3
- pkg/encoding/openapi, tools/flow: stop catching panics which no longer happen by @mvdan in 7055475bfbcedaa22302c3131c4972f94b09c3e9
- internal/core/convert: limit the nesting depth of Go values and types by @mvdan in b49a93c3dcc3f34eaff060750c2f5f51ad7a6079
- internal/core/convert: add a test for nesting Go values and types without a limit by @mvdan in 1a22324b1fd9a4eb4881e4078d10ddd442d13cb8
- cue: note that the zero Value and Selector are undefined by @mvdan in 4a3e3241a06227de3b031357001f98fb512bf811
- cuego: report an error for a nil value without leaving the package locked by @mvdan in 3ee7c656d1fb8e0140d378f90ccd827a323f3675
- cuego: add a test for a nil value leaving the package locked by @mvdan in 6ad29d3eb602be7ece3b12bae852ed8148a613fd
- internal/core/convert: do not alias an *apd.Decimal in FromGoValue by @mvdan in 271a65a4276d1bcc3f9bcf950a7327496882a9ec
- internal/core/convert: add a test for FromGoValue aliasing an *apd.Decimal by @mvdan in 0ffb19f45e06ced9ec1f81d20b18e6231d3a8882
- internal/core/convert: encode nil pointers of any type as nil by @mvdan in da519e7e0bab2f8f5b7dc0ac2326d41baf0c4b87
- internal/core/convert: add a test for nil pointers panicking in FromGoValue by @mvdan in ecfd5ab05143b0a766d8d19942c18491b71b5c94
- cue: keep the runtime in error values built without a vertex by @mvdan in bec461b3b88ff9b5254bc8fe0bfb9fad567e2f34
- cue: add a test for ErrNotAPattern panicking when used by @mvdan in 6b4e7a9b19c48258808f32d22564d21b61155b97
- cue: report an omitted slice bound in Value.Expr as the zero Value by @mvdan in 22ffaca9d3b22672ccc4bf81a3a424385bc561f3
- cue: add a test for Value.Expr panicking on an omitted slice bound by @mvdan in 02affe7436553b56d35877d1169301a28ae46cc4
- doc/ref: define file attributes and allow them after the package clause by @mvdan in 772149441a8991e82a683f2bcfd8ca53e7b18f68
- cue/parser: honor file attributes between the package clause and imports by @mvdan in ca0353af7174cb495a6461a1635b484420b2b0b0
- cue/parser: test file attributes between the package clause and imports by @mvdan in 6e0b36d3dd1fe0eec9f3c15e6c1ec3cbbbc9611d
- cue/load: point references at the final value of fields with tags by @mvdan in 480d151d83fcf5d19db5b7a941011fd74afe2f16
- cue/load: add a test for references to fields with injected tags by @mvdan in 3c5297226587b1211afa8255e566c918f0e8709f
- cue/load: inject each tag value once into syntax the loader owns by @mvdan in 770749adcbff3056cc3f18493c5dd59c3e3dafc8
- cue/load: add tests for the syntax of injected tag values by @mvdan in 12114189e21c7695dbfa8c264fbb1a0f3889fd29
- cmd/cue: find the module root in fix like other commands by @mvdan in 450e4020026cc172d0dabb590ed184a123ac8f51
- cmd/cue: add tests for fix without arguments outside a readable module by @mvdan in 2f207fb5d0d2193586f4c140463943ccb93b9274
- tools/fix: keep comments on a single embedding under a wrapper by @mvdan in 416b80eb5f5edc011d805bea75f34aec307a424e
- tools/fix: add a test for comments on a single embedding under a wrapper by @mvdan in 347f7ccb3aebec76e651f7ee0b49febaa0ce43f1
- cue/ast: clone the default expression of a field by @mvdan in 7edb1143854918ee15e70e3a9589802a5029cca0
- cue/ast: add a test for cloning the default expression of a field by @mvdan in 6ce5279695bee24e0013f75061330c7ee97b8218
- cue/ast/astutil: stop Resolve from growing the list of unresolved idents by @mvdan in e3f4476d4b39c2f1179500fc77a5181fdd216f8c
- cue/ast/astutil: add a test for resolving a file more than once by @mvdan in f2383696fb6778dbbf653f27fec6b229a5924e4d
- tools/fix: keep comments on the argument of a hoisted close by @mvdan in f6056ca99b90a69195dd274e7ef6d7a77d4ccea0
- tools/fix: add a test for comments on the argument of a hoisted close by @mvdan in 7149c2a1ef6ba63168abe605a895dcda8669acd1
- cue/ast/astutil: report a modified last element to the enclosing nodes by @mvdan in c1f3ab98adda1e811bba91e05412503df2e31e56
- cue/ast/astutil: add a test for Modified after changing a last element by @mvdan in bc774c090bf24715b447ca49cf2f622efd7bfc45
- tools/fix: close struct literals in embedded call arguments by @mvdan in c6b2ace569b7330dd02a673e6d16ec19c0c25019
- tools/fix: add a test for struct literals in embedded call arguments by @mvdan in 0ff8fc90d696fa0dc25d0a8e0dab9fd401cc9a4c
- cue/ast/astutil: update references when Apply replaces any node by @mvdan in 5c093bff362fdfd0e6947a4cc33c25152dd911fd
- cue/ast/astutil: add tests for Apply replacing an aliased field value by @mvdan in 865dfae69735b3583cc8dc3b30b38a7e0cb295ab
- tools/fix: keep the position of an expression wrapped in a builtin by @mvdan in d765fd6445ba2ea582692ab8c06c75799efc421f
- tools/fix: add tests for wrapping list elements followed by comments by @mvdan in 83b1eab9ba30040212e6479c9ed6b7f804c31e63
- cue/ast/astutil: move comments when Replace takes over the old node's by @mvdan in b0918d061a2fd6a81ea7b547a420b1d6baca9b5e
- cue/ast/astutil: add tests for Replace with a wrapper around the node by @mvdan in bef13981eed5433c4863717b1f9cced61f80ddf6
- internal/core/export: resolve dynamic field aliases to the innermost field by @mvdan in 1927ceaa07da5d324edfd4f467ea0c6347dfceac
- internal/core/export: add a test for a reused dynamic field alias by @mvdan in 368183bd4efe99340b520a5224081484035411ef
- internal/core/export: export let clauses in the scope declaring them by @mvdan in df732c77c738b89fccabf1b7d202428894199a41
- internal/core/export: add a test for a let clause used where shadowed by @mvdan in 87520f0438e9b6da51a35f310e78807ecf93243e
- internal/core/export: do not share syntax nodes with the source by @mvdan in 7562f16d953f45527046e1ab288b7f67ab58fb1b
- internal/core/export: add a test for editing exported syntax in place by @mvdan in 415c340d7b2ace9a54c1d9ee38e6dbf7e57918af
- internal/core/export: scope aliased fields to the struct declaring them by @mvdan in 9a820132d8b18130d675572b051b5ce50a538ca3
- internal/core/export: add a test for a field alias exported twice by @mvdan in c36198aff9c39907b67c3a8427ac230978c01478
- internal/core/export: scope let clauses to the struct declaring them by @mvdan in 72fad2dc806ef71490698b0f8557dc3690ba66f7
- internal/core/export: add a test for a let used outside of its struct by @mvdan in 7ebb4cd8cabc47e4252cd4a6dafc31e6fdf0755b
- pkg/list: compute arithmetic functions over open lists again by @mvdan in a6e93c7f6f74deb0eddf36b0b0c9f8b3dfa9dc36
- cmd/cue: keep going over data files after a schema error by @mvdan in 825c6d56d5e9875fd7275530b5042102c13947e0
- cmd/cue: add a test for data files stopping at the first schema error by @mvdan in 468e4ac048abc6234383123cddedb52db57cb533
- private/internal/projection: match path hints only at a path boundary by @mvdan in e87b271f1ed2b95a0fb59992f7d644d322fa6325
- doc/ref: validate the specification's CUE examples by @mvdan in 3213112028613bfd669d01bda799ce4092f90fef
- doc/ref: apply the spec's error comment edits to a copy by @mvdan in b0c4839fc53102504e0fa85689e7205999179fce
- doc/ref: add a test for updating the spec's error comments by @mvdan in 301e8d518d7c346c3fad5e220e6bcb29997262a9
- doc/ref/spec: show how an error() message refers to the validated value by @mvdan in 9feb7cc4563bfdf960ae6945a4190d0f3975fa48
- internal/core/debug: elide errors which contain the value being printed by @mvdan in 588136dc12bf23c9b9436987d63569694237058e
- internal/core/debug: add test for error() interpolating its own error by @mvdan in 23d75bccad6dcbc696ac4f21351b965882696ed6
- internal/ci: test a release in unity by its source commit by @mvdan in 6c1cb7969c849c6d75a99fa4b388c476ad960f4b