jleyba / js-dossier

A JavaScript documentation generation tool.
Apache License 2.0
150 stars 15 forks source link

Broken path / reference to proto files when used as a Bazel dependency #114

Closed adam-rocska closed 1 year ago

adam-rocska commented 5 years ago

Issue Summary

Hi!

I tried to integrate js-dossier as a dependency to generate some nice docs for the project. The plan which by my opinion should work is to load the dependencies of js-dossier; load it as an http_archive, and use //src/java/com/github/jsdossier:dossier as a genrule tool.

I've been tinkering with a fork in my workspace so far, to expose //src/java/com/github/jsdossier:dossier as public, and to make js-dossier's dependencies easily loadable using a custom dossier_repositories() call (parameterized, as it seems to be a best practice by observation).

Issue Details

Steps to reproduce

  1. Create a new Bazel workspace / repository
  2. Depend on js-dossier
  3. Attempt to use @my_local_dependency_reference//src/java/com/github/jsdossier:dossier as a genrule tool

My debug purpose genrule definition

I know this genrule as it is wouldn't generate the docs, but I fail to even refer to the dossier jar, as it break while it loads.

load("@io_bazel_rules_closure//closure:repositories.bzl", "com_google_javascript_closure_library")

genrule(
    name = "docs",
    srcs = [
        "@com_google_javascript_closure_library"
    ],
    tools = [
        "@adam_rocska_jsdossier//src/java/com/github/jsdossier:dossier"
    ],
    outs = ["asd"],
    cmd = "$(location @adam_rocska_jsdossier//src/java/com/github/jsdossier:dossier)"
)

Assumed main / root error message

../adam_rocska_jsdossier/src/proto/dossier.proto: No such file or directory

Output Log

/Users/rocskaadam/bin/bazel build --tool_tag=ijwb:IDEA:ultimate --curses=no --color=yes --progress_in_terminal_title=no -- //:docs
Loading: 
Loading: 0 packages loaded
Analyzing: target //:docs (0 packages loaded, 0 targets configured)
INFO: Analyzed target //:docs (1 packages loaded, 40 targets configured).
INFO: Found 1 target...
INFO: Deleting stale sandbox base /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox
[0 / 2] [Prepa] BazelWorkspaceStatusAction stable-status.txt
[20 / 230] Compiling external/zlib/inflate.c [for host]; 0s darwin-sandbox ... (16 actions, 15 running)
[34 / 230] Compiling external/com_google_protobuf/src/google/protobuf/wire_format_lite.cc [for host]; 1s darwin-sandbox ... (16 actions, 15 running)
[44 / 230] Compiling external/com_google_protobuf/src/google/protobuf/extension_set.cc [for host]; 2s darwin-sandbox ... (16 actions, 15 running)
[55 / 230] Compiling external/com_google_protobuf/src/google/protobuf/generated_message_table_driven_lite.cc [for host]; 2s darwin-sandbox ... (16 actions, 15 running)
[61 / 230] Compiling external/com_google_protobuf/src/google/protobuf/generated_message_table_driven.cc [for host]; 3s darwin-sandbox ... (16 actions, 15 running)
[70 / 230] Compiling external/com_google_protobuf/src/google/protobuf/generated_message_reflection.cc [for host]; 3s darwin-sandbox ... (16 actions, 15 running)
[79 / 230] Compiling external/com_google_protobuf/src/google/protobuf/descriptor.cc [for host]; 4s darwin-sandbox ... (16 actions, 15 running)
[86 / 230] Compiling external/com_google_protobuf/src/google/protobuf/descriptor.cc [for host]; 5s darwin-sandbox ... (16 actions, 15 running)
[95 / 230] Compiling external/com_google_protobuf/src/google/protobuf/descriptor.cc [for host]; 6s darwin-sandbox ... (16 actions, 15 running)
[103 / 230] Compiling external/com_google_protobuf/src/google/protobuf/descriptor.cc [for host]; 8s darwin-sandbox ... (16 actions running)
[111 / 230] Compiling external/com_google_protobuf/src/google/protobuf/descriptor.cc [for host]; 10s darwin-sandbox ... (15 actions running)
[122 / 230] Compiling external/com_google_protobuf/src/google/protobuf/descriptor.cc [for host]; 12s darwin-sandbox ... (16 actions running)
[137 / 230] Compiling external/com_google_protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc [for host]; 9s darwin-sandbox ... (16 actions running)
[155 / 230] Compiling external/com_google_protobuf/src/google/protobuf/compiler/js/js_generator.cc [for host]; 6s darwin-sandbox ... (16 actions running)
[949 / 1,756] Compiling external/com_google_protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc [for host]; 2s darwin-sandbox ... (7 actions running)
ERROR: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/src/proto/BUILD:10:1: Generating <generated file external/adam_rocska_jsdossier/src/proto/js_proto.js> failed (Exit 1) sandbox-exec failed: error executing command 
  (cd /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/220/execroot/__main__ && \
  exec env - \
    TMPDIR=/var/folders/r1/5_y8gt9931l0084_1wxg8mw40000gn/T/ \
  /usr/bin/sandbox-exec -f /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/220/sandbox.sb /var/tmp/_bazel_rocskaadam/install/033b3dbfe258c4bd4b40d8a507bad31d/_embedded_binaries/process-wrapper '--timeout=0' '--kill_delay=15' bazel-out/host/bin/external/com_google_protobuf/protoc '--js_out=binary,error_on_name_conflict,library=js_proto:bazel-out/host/bin/external/adam_rocska_jsdossier/src/proto' --descriptor_set_in bazel-out/host/bin/external/adam_rocska_jsdossier/third_party/webutil/html/types/proto/proto-descriptor-set.proto.bin:bazel-out/host/bin/external/adam_rocska_jsdossier/src/proto/proto-descriptor-set.proto.bin ../adam_rocska_jsdossier/src/proto/dossier.proto ../adam_rocska_jsdossier/src/proto/expression.proto ../adam_rocska_jsdossier/src/proto/state.proto)
../adam_rocska_jsdossier/src/proto/dossier.proto: No such file or directory
Target //:docs failed to build
ERROR: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/src/java/com/github/jsdossier/BUILD:1:1 Generating <generated file external/adam_rocska_jsdossier/src/proto/js_proto.js> failed (Exit 1) sandbox-exec failed: error executing command 
  (cd /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/220/execroot/__main__ && \
  exec env - \
    TMPDIR=/var/folders/r1/5_y8gt9931l0084_1wxg8mw40000gn/T/ \
  /usr/bin/sandbox-exec -f /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/220/sandbox.sb /var/tmp/_bazel_rocskaadam/install/033b3dbfe258c4bd4b40d8a507bad31d/_embedded_binaries/process-wrapper '--timeout=0' '--kill_delay=15' bazel-out/host/bin/external/com_google_protobuf/protoc '--js_out=binary,error_on_name_conflict,library=js_proto:bazel-out/host/bin/external/adam_rocska_jsdossier/src/proto' --descriptor_set_in bazel-out/host/bin/external/adam_rocska_jsdossier/third_party/webutil/html/types/proto/proto-descriptor-set.proto.bin:bazel-out/host/bin/external/adam_rocska_jsdossier/src/proto/proto-descriptor-set.proto.bin ../adam_rocska_jsdossier/src/proto/dossier.proto ../adam_rocska_jsdossier/src/proto/expression.proto ../adam_rocska_jsdossier/src/proto/state.proto)
INFO: Elapsed time: 27.389s, Critical Path: 14.68s
INFO: 218 processes: 218 darwin-sandbox.
FAILED: Build did NOT complete successfully
FAILED: Build did NOT complete successfully
adam-rocska commented 5 years ago

In hope, that it will help debugging, I'll add some more infos I found.

So, most probably the build_tools/javascript.bzl is broken. For debugging purposes I edited the file, and added the following debug code before ctx.actions.run :

for src in lib[ProtoInfo].transitive_sources.to_list():
        print("| src.short_path | ", src.short_path)
        print("| src.path       | ", src.path)
        print("| src.dirname    | ", src.dirname)
        print("| src.basename   | ", src.basename)
        print("| src.root       | ", src.root.path)
        print("|----------------|--------------------------------")

Which produces the following output when running the js-dossier build directly :

DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:19:9: | src.short_path |  src/proto/dossier.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:20:9: | src.path       |  src/proto/dossier.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:21:9: | src.dirname    |  src/proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:22:9: | src.basename   |  dossier.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:23:9: | src.root       |  
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:19:9: | src.short_path |  src/proto/expression.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:20:9: | src.path       |  src/proto/expression.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:21:9: | src.dirname    |  src/proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:22:9: | src.basename   |  expression.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:23:9: | src.root       |  
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:19:9: | src.short_path |  src/proto/state.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:20:9: | src.path       |  src/proto/state.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:21:9: | src.dirname    |  src/proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:22:9: | src.basename   |  state.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:23:9: | src.root       |  
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:19:9: | src.short_path |  third_party/webutil/html/types/proto/_virtual_imports/proto/webutil/html/types/proto/html.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:20:9: | src.path       |  bazel-out/darwin-fastbuild/bin/third_party/webutil/html/types/proto/_virtual_imports/proto/webutil/html/types/proto/html.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:21:9: | src.dirname    |  bazel-out/darwin-fastbuild/bin/third_party/webutil/html/types/proto/_virtual_imports/proto/webutil/html/types/proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:22:9: | src.basename   |  html.proto
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:23:9: | src.root       |  bazel-out/darwin-fastbuild/bin
DEBUG: /Users/rocskaadam/src/adam-rocska/src/js-dossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------

And the following output when running as a dependency :

DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:19:9: | src.short_path |  ../adam_rocska_jsdossier/src/proto/dossier.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:20:9: | src.path       |  external/adam_rocska_jsdossier/src/proto/dossier.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:21:9: | src.dirname    |  external/adam_rocska_jsdossier/src/proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:22:9: | src.basename   |  dossier.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:23:9: | src.root       |  
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:19:9: | src.short_path |  ../adam_rocska_jsdossier/src/proto/expression.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:20:9: | src.path       |  external/adam_rocska_jsdossier/src/proto/expression.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:21:9: | src.dirname    |  external/adam_rocska_jsdossier/src/proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:22:9: | src.basename   |  expression.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:23:9: | src.root       |  
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:19:9: | src.short_path |  ../adam_rocska_jsdossier/src/proto/state.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:20:9: | src.path       |  external/adam_rocska_jsdossier/src/proto/state.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:21:9: | src.dirname    |  external/adam_rocska_jsdossier/src/proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:22:9: | src.basename   |  state.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:23:9: | src.root       |  
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:19:9: | src.short_path |  ../adam_rocska_jsdossier/third_party/webutil/html/types/proto/_virtual_imports/proto/webutil/html/types/proto/html.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:20:9: | src.path       |  bazel-out/host/bin/external/adam_rocska_jsdossier/third_party/webutil/html/types/proto/_virtual_imports/proto/webutil/html/types/proto/html.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:21:9: | src.dirname    |  bazel-out/host/bin/external/adam_rocska_jsdossier/third_party/webutil/html/types/proto/_virtual_imports/proto/webutil/html/types/proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:22:9: | src.basename   |  html.proto
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:23:9: | src.root       |  bazel-out/host/bin
DEBUG: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/build_tools/javascript.bzl:24:9: |----------------|--------------------------------

I'm definitely not a Bazel, Skylark, etc. expert. Just a humble user. But as a layman this doesn't look good.

adam-rocska commented 5 years ago

I get the same behavior if by experiment I change my genrule definition :

genrule(
    name = "docs",
    srcs = [
        "@com_google_javascript_closure_library",
        "@adam_rocska_jsdossier//src/java/com/github/jsdossier:dossier_deploy.jar"
    ],

    outs = ["asd"],
    cmd = "$(locations @adam_rocska_jsdossier//src/java/com/github/jsdossier:dossier_deploy.jar)"
)

console out :

ERROR: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/src/proto/BUILD:10:1: Generating <generated file external/adam_rocska_jsdossier/src/proto/js_proto.js> failed (Exit 1) sandbox-exec failed: error executing command 
  (cd /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/55/execroot/__main__ && \
  exec env - \
    TMPDIR=/var/folders/r1/5_y8gt9931l0084_1wxg8mw40000gn/T/ \
  /usr/bin/sandbox-exec -f /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/55/sandbox.sb /var/tmp/_bazel_rocskaadam/install/033b3dbfe258c4bd4b40d8a507bad31d/_embedded_binaries/process-wrapper '--timeout=0' '--kill_delay=15' bazel-out/host/bin/external/com_google_protobuf/protoc '--js_out=binary,error_on_name_conflict,library=js_proto:bazel-out/darwin-fastbuild/bin/external/adam_rocska_jsdossier/src/proto' --descriptor_set_in bazel-out/darwin-fastbuild/bin/external/adam_rocska_jsdossier/third_party/webutil/html/types/proto/proto-descriptor-set.proto.bin:bazel-out/darwin-fastbuild/bin/external/adam_rocska_jsdossier/src/proto/proto-descriptor-set.proto.bin ../adam_rocska_jsdossier/src/proto/dossier.proto ../adam_rocska_jsdossier/src/proto/expression.proto ../adam_rocska_jsdossier/src/proto/state.proto)
../adam_rocska_jsdossier/src/proto/dossier.proto: No such file or directory
Target //:docs failed to build
ERROR: /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/external/adam_rocska_jsdossier/src/java/com/github/jsdossier/BUILD:1:1 Generating <generated file external/adam_rocska_jsdossier/src/proto/js_proto.js> failed (Exit 1) sandbox-exec failed: error executing command 
  (cd /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/55/execroot/__main__ && \
  exec env - \
    TMPDIR=/var/folders/r1/5_y8gt9931l0084_1wxg8mw40000gn/T/ \
  /usr/bin/sandbox-exec -f /private/var/tmp/_bazel_rocskaadam/aa3aa7e1d2c5ae4510d2a170d237dd00/sandbox/darwin-sandbox/55/sandbox.sb /var/tmp/_bazel_rocskaadam/install/033b3dbfe258c4bd4b40d8a507bad31d/_embedded_binaries/process-wrapper '--timeout=0' '--kill_delay=15' bazel-out/host/bin/external/com_google_protobuf/protoc '--js_out=binary,error_on_name_conflict,library=js_proto:bazel-out/darwin-fastbuild/bin/external/adam_rocska_jsdossier/src/proto' --descriptor_set_in bazel-out/darwin-fastbuild/bin/external/adam_rocska_jsdossier/third_party/webutil/html/types/proto/proto-descriptor-set.proto.bin:bazel-out/darwin-fastbuild/bin/external/adam_rocska_jsdossier/src/proto/proto-descriptor-set.proto.bin ../adam_rocska_jsdossier/src/proto/dossier.proto ../adam_rocska_jsdossier/src/proto/expression.proto ../adam_rocska_jsdossier/src/proto/state.proto)
adam-rocska commented 5 years ago

Maybe I'm getting closer to the solution, maybe not, but I'll leave this link here, in case it'd be helpful : https://stackoverflow.com/questions/55796252/how-to-write-bazel-rules-that-work-with-external-repositories

adam-rocska commented 5 years ago

Now I give up for a while. It seems like these could be related :

  1. https://github.com/bazelbuild/bazel/issues/7964
  2. https://github.com/bazelbuild/bazel/issues/7157
  3. https://github.com/bazelbuild/bazel/issues/9215

I'll attempt to fall back to using an old version of js-dossier on your repo, that was published as a jar, and revisit this problem later.

I would love to fix it myself, but I just couldn't. Spent a few days on it with no result (but at least I learned a lot about the internals of Bazel, and its surroundings).