tedge-agent fails to download binary from Cumulocity IoT due to 401 error

Describe the bug

The thin-edge.io software management plugin fails to download a binary stored in Cumulocity IoT if the JWT has expired (and this error does not trigger a renewal of the token).
To Reproduce

Start thin-edge.io and its components (only mosquitto, tedge-agent and the tedge-mapper-c8y are required)
Wait until the Cumulocity IoT token requested on startup as expired. On Cumulocity eu-latest the expiration is set to 1 hour (though decode the JWT to check the expiration timestamp)
Create a software package and version in Cumulocity IoT and upload a binary which is hosted within Cumulocity IoT (don't use an external URL)
On the thin-edge.io device trigger a software update using the software package uploaded in the previous step
If no bug is observed, the operation should be set to SUCCESSFUL. With the bug the operation is set to FAILED, and the error "Could not make a successful request to the remote server" is shown in the software update logs, as well as a corresponding error ("HTTP status client error (401 Unauthorized) for url") in the tedge-agent logs.

Expected behavior

the tedge-agent should renew the Cumulocity IoT token if required so that the binary hosted in Cumulocity IoT can be downloaded successfully

Screenshots

Environment (please complete the following information):

OS [incl. version]: Alpine Linux 3.18
Hardware [incl. revision]: Docker container running on aarch64
System-Architecture [e.g. result of "uname -a"]: Linux cb069e118bbc 5.15.68-0-virt #1-Alpine SMP Fri, 16 Sep 2022 06:29:31 +0000 aarch64 Linux
thin-edge.io version [e.g. 0.1.0]: 0.12.1~99+g3e0fe253

Additional context

The following shows the logs from the failed attempt (with the tokens redacted):
file: tedge-mapper-c8y
2023-08-20T09:20:35.983272265Z  INFO MQTT: send Message { topic: Topic { name: "c8y/s/ds" }, payload: "528,rmi_apk_demo001,example,1.2.3::apk,https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966,install", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:35.984529224Z  INFO CumulocityMapper: recv Some(MqttMessage(Message { topic: Topic { name: "c8y/s/ds" }, payload: "528,rmi_apk_demo001,example,1.2.3::apk,https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966,install", qos: AtLeastOnce, retain: false }))
2023-08-20T09:20:35.985296932Z  INFO C8yMapper => C8YHttpProxy: send GetJwtToken(GetJwtToken)
2023-08-20T09:20:35.985428932Z  INFO C8Y-REST: recv Some((0, GetJwtToken(GetJwtToken)))
2023-08-20T09:20:35.985546765Z  INFO C8Y-REST: send (0, Ok(EventId("<<redacted>>")))
2023-08-20T09:20:35.985642099Z  INFO C8yMapper => C8YHttpProxy: recv Some(Ok(EventId("<<redacted>>")))
2023-08-20T09:20:35.98606064Z  INFO C8yMapper => Mqtt: send Message { topic: Topic { name: "tedge/commands/req/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","updateList":[{"type":"apk","modules":[{"name":"example","version":"1.2.3","url":"https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966","auth":{"bearer":"<<redacted>>"},"action":"install"}]}]}", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:35.986202432Z  INFO MQTT: recv Ok(Some(Message { topic: Topic { name: "tedge/commands/req/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","updateList":[{"type":"apk","modules":[{"name":"example","version":"1.2.3","url":"https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966","auth":{"bearer":"<<redacted>>"},"action":"install"}]}]}", qos: AtLeastOnce, retain: false }))
2023-08-20T09:20:36.301883391Z  INFO MQTT: send Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"executing"}", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:36.301928849Z  INFO CumulocityMapper: recv Some(MqttMessage(Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"executing"}", qos: AtLeastOnce, retain: false }))
2023-08-20T09:20:36.302009974Z  INFO C8yMapper => Mqtt: send Message { topic: Topic { name: "c8y/s/us" }, payload: "501,c8y_SoftwareUpdate
", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:36.302024557Z  INFO MQTT: recv Ok(Some(Message { topic: Topic { name: "c8y/s/us" }, payload: "501,c8y_SoftwareUpdate
", qos: AtLeastOnce, retain: false }))
2023-08-20T09:20:37.124621266Z  INFO MQTT: send Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"failed","reason":"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log","currentSoftwareList":[{"type":"apk","modules":[{"name":"alpine-baselayout","version":"3.4.3-r1"},{"name":"alpine-baselayout-data","version":"3.4.3-r1"},{"name":"alpine-keys","version":"2.4-r1"},{"name":"apk-tools","version":"2.14.0-r2"},{"name":"busybox","version":"1.36.1-r2"},{"name":"busybox-binsh","version":"1.36.1-r2"},{"name":"c-ares","version":"1.19.1-r0"},{"name":"ca-certificates","version":"20230506-r0"},{"name":"ca-certificates-bundle","version":"20230506-r0"},{"name":"cjson","version":"1.7.15-r4"},{"name":"ifupdown-ng","version":"0.12.1-r2"},{"name":"libc-utils","version":"0.7.2-r5"},{"name":"libcap2","version":"2.69-r0"},{"name":"libcrypto3","version":"3.1.2-r0"},{"name":"libssl3","version":"3.1.2-r0"},{"name":"libwebsockets","version":"4.3.2-r2"},{"name":"mosquitto","version":"2.0.15-r3"},{"name":"mosquitto-libs","version":"2.0.15-r3"},{"name":"mosquitto-openrc","version":"2.0.15-r3"},{"name":"musl","version":"1.2.4-r1"},{"name":"musl-utils","version":"1.2.4-r1"},{"name":"openrc","version":"0.48-r0"},{"name":"scanelf","version":"1.3.7-r1"},{"name":"ssl_client","version":"1.36.1-r2"},{"name":"sudo","version":"1.9.13_p3-r2"},{"name":"tedge-apk","version":"plugin-0.0.0rc0"},{"name":"zlib","version":"1.2.13-r1"}]}],"failures":[{"type":"apk","modules":[]}]}", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:37.125599308Z  INFO CumulocityMapper: recv Some(MqttMessage(Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"failed","reason":"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log","currentSoftwareList":[{"type":"apk","modules":[{"name":"alpine-baselayout","version":"3.4.3-r1"},{"name":"alpine-baselayout-data","version":"3.4.3-r1"},{"name":"alpine-keys","version":"2.4-r1"},{"name":"apk-tools","version":"2.14.0-r2"},{"name":"busybox","version":"1.36.1-r2"},{"name":"busybox-binsh","version":"1.36.1-r2"},{"name":"c-ares","version":"1.19.1-r0"},{"name":"ca-certificates","version":"20230506-r0"},{"name":"ca-certificates-bundle","version":"20230506-r0"},{"name":"cjson","version":"1.7.15-r4"},{"name":"ifupdown-ng","version":"0.12.1-r2"},{"name":"libc-utils","version":"0.7.2-r5"},{"name":"libcap2","version":"2.69-r0"},{"name":"libcrypto3","version":"3.1.2-r0"},{"name":"libssl3","version":"3.1.2-r0"},{"name":"libwebsockets","version":"4.3.2-r2"},{"name":"mosquitto","version":"2.0.15-r3"},{"name":"mosquitto-libs","version":"2.0.15-r3"},{"name":"mosquitto-openrc","version":"2.0.15-r3"},{"name":"musl","version":"1.2.4-r1"},{"name":"musl-utils","version":"1.2.4-r1"},{"name":"openrc","version":"0.48-r0"},{"name":"scanelf","version":"1.3.7-r1"},{"name":"ssl_client","version":"1.36.1-r2"},{"name":"sudo","version":"1.9.13_p3-r2"},{"name":"tedge-apk","version":"plugin-0.0.0rc0"},{"name":"zlib","version":"1.2.13-r1"}]}],"failures":[{"type":"apk","modules":[]}]}", qos: AtLeastOnce, retain: false }))
2023-08-20T09:20:37.125708683Z ERROR c8y_mapper_ext::converter: Received a failed software response: {"id":"f-kb8vdNLyYb646AachvU","status":"failed","reason":"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log","currentSoftwareList":[{"type":"apk","modules":[{"name":"alpine-baselayout","version":"3.4.3-r1"},{"name":"alpine-baselayout-data","version":"3.4.3-r1"},{"name":"alpine-keys","version":"2.4-r1"},{"name":"apk-tools","version":"2.14.0-r2"},{"name":"busybox","version":"1.36.1-r2"},{"name":"busybox-binsh","version":"1.36.1-r2"},{"name":"c-ares","version":"1.19.1-r0"},{"name":"ca-certificates","version":"20230506-r0"},{"name":"ca-certificates-bundle","version":"20230506-r0"},{"name":"cjson","version":"1.7.15-r4"},{"name":"ifupdown-ng","version":"0.12.1-r2"},{"name":"libc-utils","version":"0.7.2-r5"},{"name":"libcap2","version":"2.69-r0"},{"name":"libcrypto3","version":"3.1.2-r0"},{"name":"libssl3","version":"3.1.2-r0"},{"name":"libwebsockets","version":"4.3.2-r2"},{"name":"mosquitto","version":"2.0.15-r3"},{"name":"mosquitto-libs","version":"2.0.15-r3"},{"name":"mosquitto-openrc","version":"2.0.15-r3"},{"name":"musl","version":"1.2.4-r1"},{"name":"musl-utils","version":"1.2.4-r1"},{"name":"openrc","version":"0.48-r0"},{"name":"scanelf","version":"1.3.7-r1"},{"name":"ssl_client","version":"1.36.1-r2"},{"name":"sudo","version":"1.9.13_p3-r2"},{"name":"tedge-apk","version":"plugin-0.0.0rc0"},{"name":"zlib","version":"1.2.13-r1"}]}],"failures":[{"type":"apk","modules":[]}]}
2023-08-20T09:20:37.125718641Z  INFO C8yMapper => Mqtt: send Message { topic: Topic { name: "c8y/s/us" }, payload: "502,c8y_SoftwareUpdate,"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log"
", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:37.125724933Z  INFO MQTT: recv Ok(Some(Message { topic: Topic { name: "c8y/s/us" }, payload: "502,c8y_SoftwareUpdate,"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log"
", qos: AtLeastOnce, retain: false }))

file: tedge-agent
2023-08-20T09:20:36.295657682Z  INFO plugin_sm::plugin_manager: Plugin activated: /etc/tedge/sm-plugins/apk
2023-08-20T09:20:36.301354224Z  INFO SoftwareManager: send SoftwareUpdateResponse(SoftwareUpdateResponse { response: SoftwareRequestResponse { id: "f-kb8vdNLyYb646AachvU", status: Executing, reason: None, current_software_list: None, failures: [] } })
2023-08-20T09:20:36.301450641Z  INFO Mqtt-Request-Converter: recv Some(SoftwareResponse(SoftwareUpdateResponse(SoftwareUpdateResponse { response: SoftwareRequestResponse { id: "f-kb8vdNLyYb646AachvU", status: Executing, reason: None, current_software_list: None, failures: [] } })))
2023-08-20T09:20:36.301459016Z  INFO MqttPublisher: send Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"executing"}", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:36.301486016Z  INFO MQTT: recv Ok(Some(Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"executing"}", qos: AtLeastOnce, retain: false }))
2023-08-20T09:20:36.941909808Z ERROR plugin_sm::plugin: Download error: DownloadError {
    reason: "Could not make a successful request to the remote server",
    url: "https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966",
    source_err: "HTTP status client error (401 Unauthorized) for url (https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966)",
}
2023-08-20T09:20:37.124109349Z  INFO SoftwareManager: send SoftwareUpdateResponse(SoftwareUpdateResponse { response: SoftwareRequestResponse { id: "f-kb8vdNLyYb646AachvU", status: Failed, reason: Some("1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log"), current_software_list: Some([SoftwareRequestResponseSoftwareList { plugin_type: "apk", modules: [SoftwareModuleItem { name: "alpine-baselayout", version: Some("3.4.3-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "alpine-baselayout-data", version: Some("3.4.3-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "alpine-keys", version: Some("2.4-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "apk-tools", version: Some("2.14.0-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "busybox", version: Some("1.36.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "busybox-binsh", version: Some("1.36.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "c-ares", version: Some("1.19.1-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ca-certificates", version: Some("20230506-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ca-certificates-bundle", version: Some("20230506-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "cjson", version: Some("1.7.15-r4"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ifupdown-ng", version: Some("0.12.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libc-utils", version: Some("0.7.2-r5"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libcap2", version: Some("2.69-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libcrypto3", version: Some("3.1.2-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libssl3", version: Some("3.1.2-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libwebsockets", version: Some("4.3.2-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "mosquitto", version: Some("2.0.15-r3"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "mosquitto-libs", version: Some("2.0.15-r3"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "mosquitto-openrc", version: Some("2.0.15-r3"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "musl", version: Some("1.2.4-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "musl-utils", version: Some("1.2.4-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "openrc", version: Some("0.48-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "scanelf", version: Some("1.3.7-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ssl_client", version: Some("1.36.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "sudo", version: Some("1.9.13_p3-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "tedge-apk", version: Some("plugin-0.0.0rc0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "zlib", version: Some("1.2.13-r1"), url: None, action: None, reason: None }] }]), failures: [SoftwareRequestResponseSoftwareList { plugin_type: "apk", modules: [] }] } })
2023-08-20T09:20:37.124186308Z  INFO Mqtt-Request-Converter: recv Some(SoftwareResponse(SoftwareUpdateResponse(SoftwareUpdateResponse { response: SoftwareRequestResponse { id: "f-kb8vdNLyYb646AachvU", status: Failed, reason: Some("1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log"), current_software_list: Some([SoftwareRequestResponseSoftwareList { plugin_type: "apk", modules: [SoftwareModuleItem { name: "alpine-baselayout", version: Some("3.4.3-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "alpine-baselayout-data", version: Some("3.4.3-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "alpine-keys", version: Some("2.4-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "apk-tools", version: Some("2.14.0-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "busybox", version: Some("1.36.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "busybox-binsh", version: Some("1.36.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "c-ares", version: Some("1.19.1-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ca-certificates", version: Some("20230506-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ca-certificates-bundle", version: Some("20230506-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "cjson", version: Some("1.7.15-r4"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ifupdown-ng", version: Some("0.12.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libc-utils", version: Some("0.7.2-r5"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libcap2", version: Some("2.69-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libcrypto3", version: Some("3.1.2-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libssl3", version: Some("3.1.2-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "libwebsockets", version: Some("4.3.2-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "mosquitto", version: Some("2.0.15-r3"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "mosquitto-libs", version: Some("2.0.15-r3"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "mosquitto-openrc", version: Some("2.0.15-r3"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "musl", version: Some("1.2.4-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "musl-utils", version: Some("1.2.4-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "openrc", version: Some("0.48-r0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "scanelf", version: Some("1.3.7-r1"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "ssl_client", version: Some("1.36.1-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "sudo", version: Some("1.9.13_p3-r2"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "tedge-apk", version: Some("plugin-0.0.0rc0"), url: None, action: None, reason: None }, SoftwareModuleItem { name: "zlib", version: Some("1.2.13-r1"), url: None, action: None, reason: None }] }]), failures: [SoftwareRequestResponseSoftwareList { plugin_type: "apk", modules: [] }] } })))
2023-08-20T09:20:37.124212933Z  INFO MqttPublisher: send Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"failed","reason":"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log","currentSoftwareList":[{"type":"apk","modules":[{"name":"alpine-baselayout","version":"3.4.3-r1"},{"name":"alpine-baselayout-data","version":"3.4.3-r1"},{"name":"alpine-keys","version":"2.4-r1"},{"name":"apk-tools","version":"2.14.0-r2"},{"name":"busybox","version":"1.36.1-r2"},{"name":"busybox-binsh","version":"1.36.1-r2"},{"name":"c-ares","version":"1.19.1-r0"},{"name":"ca-certificates","version":"20230506-r0"},{"name":"ca-certificates-bundle","version":"20230506-r0"},{"name":"cjson","version":"1.7.15-r4"},{"name":"ifupdown-ng","version":"0.12.1-r2"},{"name":"libc-utils","version":"0.7.2-r5"},{"name":"libcap2","version":"2.69-r0"},{"name":"libcrypto3","version":"3.1.2-r0"},{"name":"libssl3","version":"3.1.2-r0"},{"name":"libwebsockets","version":"4.3.2-r2"},{"name":"mosquitto","version":"2.0.15-r3"},{"name":"mosquitto-libs","version":"2.0.15-r3"},{"name":"mosquitto-openrc","version":"2.0.15-r3"},{"name":"musl","version":"1.2.4-r1"},{"name":"musl-utils","version":"1.2.4-r1"},{"name":"openrc","version":"0.48-r0"},{"name":"scanelf","version":"1.3.7-r1"},{"name":"ssl_client","version":"1.36.1-r2"},{"name":"sudo","version":"1.9.13_p3-r2"},{"name":"tedge-apk","version":"plugin-0.0.0rc0"},{"name":"zlib","version":"1.2.13-r1"}]}],"failures":[{"type":"apk","modules":[]}]}", qos: AtLeastOnce, retain: false }
2023-08-20T09:20:37.124226558Z  INFO MQTT: recv Ok(Some(Message { topic: Topic { name: "tedge/commands/res/software/update" }, payload: "{"id":"f-kb8vdNLyYb646AachvU","status":"failed","reason":"1 error, see device log file /var/log/tedge/agent/software-update-2023-08-20T09:20:36.301435432Z.log","currentSoftwareList":[{"type":"apk","modules":[{"name":"alpine-baselayout","version":"3.4.3-r1"},{"name":"alpine-baselayout-data","version":"3.4.3-r1"},{"name":"alpine-keys","version":"2.4-r1"},{"name":"apk-tools","version":"2.14.0-r2"},{"name":"busybox","version":"1.36.1-r2"},{"name":"busybox-binsh","version":"1.36.1-r2"},{"name":"c-ares","version":"1.19.1-r0"},{"name":"ca-certificates","version":"20230506-r0"},{"name":"ca-certificates-bundle","version":"20230506-r0"},{"name":"cjson","version":"1.7.15-r4"},{"name":"ifupdown-ng","version":"0.12.1-r2"},{"name":"libc-utils","version":"0.7.2-r5"},{"name":"libcap2","version":"2.69-r0"},{"name":"libcrypto3","version":"3.1.2-r0"},{"name":"libssl3","version":"3.1.2-r0"},{"name":"libwebsockets","version":"4.3.2-r2"},{"name":"mosquitto","version":"2.0.15-r3"},{"name":"mosquitto-libs","version":"2.0.15-r3"},{"name":"mosquitto-openrc","version":"2.0.15-r3"},{"name":"musl","version":"1.2.4-r1"},{"name":"musl-utils","version":"1.2.4-r1"},{"name":"openrc","version":"0.48-r0"},{"name":"scanelf","version":"1.3.7-r1"},{"name":"ssl_client","version":"1.36.1-r2"},{"name":"sudo","version":"1.9.13_p3-r2"},{"name":"tedge-apk","version":"plugin-0.0.0rc0"},{"name":"zlib","version":"1.2.13-r1"}]}],"failures":[{"type":"apk","modules":[]}]}", qos: AtLeastOnce, retain: false }))

software-update logs
----- $ Downloading: https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966 to /tmp/example_1.2.3
error: DownloadError error: "Could not make a successful request to the remote server" for "https://t493319102.eu-latest.cumulocity.com/inventory/binaries/29251966"

Unfortunately, this is a design bug. The jwt token is given by the c8y mapper to the agent. If the token expires before being used, then the agent has no way to refresh it.
The solution proposed for the tedge-configuration-plugin is to give to the c8y mapper the responsibility to download the files. The same approach can be used for software updates. The agent will only have to operate local files.

The design bug has been made more serious by this PR that caches the JWT tokens. It's not more enough to retry a software update operation, when it fails with a 401.
This will be fixed by : https://github.com/thin-edge/thin-edge.io/issues/2175

The idea of a local proxy seems sensible to me, and seems like a nice HTTP counterpart to the mosquitto broker providing (locally) unauthenticated access to Cumulocity over MQTT.
Things I would bear in mind:

Would customers potentially want this service to be authenticated in some way?
If this were to expand beyond GET requests, where we can easily retry the request if it's rejected with a 401 (and therefore we probably don't need to worry about determining validity ourselves), how do we assess whether the JWT we last used is valid? Do we look at the expiration date of the JWT, do we look at how long ago we received the
JWT, or do we just transparently retry requests when they fail? Retrying non-GET requests is trickier as we would need to store the body, which could (potentially) be quite large

From my not-particularly-in-depth mental model of thin-edge, the mapper seems like a sensible place for this. I agree there is source for confusion between this and file transfer service port.
One other thing to consider is that JWTs on Cumulocity can be revoked, so the mapper cannot act as a source of truth for whether our request will be authorized (which does rather defeat the point of JWTs in the first place). This appears to happen if I attempt to access the UI with a (device) JWT. After that, no more requests will work with that JWT and a new one will need to be requested. This probably wouldn't cause an issue in practice, but creating a Cumulocity proxy does make this quite easy to do, since all you have to do is visit the webpage in your browser (although we can potentially limit the proxy to known APIs/block requests immediately to APIs we know won't work).

Would customers potentially want this service to be authenticated in some way?

At some point, yes. The same certificates should be used as for local MQTT connections.

How do we assess whether the JWT we last used is valid?

The current approach is to request a new token on 401 or 403 and to only return the error when this fresh token is also rejected.

Retrying non-GET requests is trickier as we would need to store the body, which could (potentially) be quite large

Yes, this approach is more problematic for POST and PUT request. Trying first with a HEAD request can help to check the token.

One other thing to consider is that JWTs on Cumulocity can be revoked, so the mapper cannot act as a source of truth for whether our request will be authorized (which does rather defeat the point of JWTs in the first place). This appears to happen if I attempt to access the UI with a (device) JWT. After that, no more requests will work with that JWT and a new one will need to be requested. This probably wouldn't cause an issue in practice, but creating a Cumulocity proxy does make this quite easy to do, since all you have to do is visit the webpage in your browser (although we can potentially limit the proxy to known APIs/block requests immediately to APIs we know won't work).

This is why it's simpler to request a new token after an authentication or authorization response.

The main issue has been solved by https://github.com/thin-edge/thin-edge.io/pull/2261:

Tedge-agent should no more fail to download a software binary from C8Y because of an expired token (401 error).
A new feature has been introduced: c8y-auth-proxy: however this c8y-auth-proxy is not documented yet.

The following has still to be done:

[ ] Document c8y-auth-proxy as this is a user facing feature. How to configure the proxy local HTTP port. How to send HTTP requests to c8y using this proxy.
[ ] Use c8y-auth-proxy to download not only software packages but also configuration files and firmware.
[ ] Use c8y-auth-proxy to upload logs, configuration files, software lists and events.
[ ] Consider to deprecate JWT handling as done by the c8y-http-proxy.

@gligorisaev I've created a PR with some public documentation: https://github.com/thin-edge/thin-edge.io/pull/2330.

QA has thoroughly checked the bug and here are the results:

[ ] Test for ticket exists in the test suite.
[x] QA has tested the bug and could not reproduce it anymore.


PLD-712 PLD-734 Settings for Tomcat proxy and Jetty

 Thank you for your submission, we really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.2 out of 9 committers have signed the CLA.:white_check_mark: knstvk:white_check_mark: jreznot:x: oshiryaeva:x: gorbunkov:x: web-devel:x: glebfox:x: rabkesov:x: natfirst:x: rapekasrabkesov seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.You have signed the CLA already but the status is still pending? Let us recheck it.


Correctly handle read-only ByteBuf in ByteToMessageDecoder

Motivation:
If a read-only ByteBuf is passed to the ByteToMessageDecoder.channelRead(...) method we need to make a copy of it if its the first buffer as we may need to write to it later on to merge data. This usually is not the case but can for example happen if the local transport is used. This was the cause of the leak report we sometimes saw during the codec-http2 tests, as we are using the local transport and write a read-only buffer. This buffer will then be passed to the peer channel and fired through the pipeline and so end up as the cumulation buffer in the ByteToMessageDecoder. Once the next fragement is received we tried to merge these and failed with a ReadOnlyBufferException which then produced a leak.
Modifications:
Ensure we copy the buffer if its read-only.
Result:
No more exceptions and so leak when a read-only buffer is passed to ByteToMessageDecoder.channelRead(...)

@Scottmitch PTAL this was the cause of the leak we sometimes saw on the CI when running the codec-http2 tests. With this PR the CI should pass again without problems and no leaks

Also these exceptions were logged before the patch:
[13:03:10] :		 [io.netty:netty-codec-http2] 13:03:10.953 [defaultEventLoopGroup-52-1] DEBUG i.n.h.c.http2.Http2ConnectionHandler - [id: 0xa9cd1eea, L:local:E:1de99f0d - R:local:httptohttp2connectionhandlertest] Sent GOAWAY: lastStreamId '0', errorCode '2', debugData ':scheme must be specified. see https://tools.ietf.org/html/rfc7540#section-<IP_ADDRESS>'. Forcing shutdown of the connection.
[13:03:10] :		 [io.netty:netty-codec-http2] 13:03:10.954 [defaultEventLoopGroup-51-2] WARN  i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
[13:03:10] :		 [io.netty:netty-codec-http2] io.netty.handler.codec.DecoderException: java.nio.ReadOnlyBufferException
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:252)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.local.LocalChannel.finishPeerRead0(LocalChannel.java:443)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.local.LocalChannel.finishPeerRead(LocalChannel.java:385)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.local.LocalChannel.doClose(LocalChannel.java:237)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:685)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:664)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:607)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.local.LocalChannel.tryClose(LocalChannel.java:283)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.local.LocalChannel.access$400(LocalChannel.java:49)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.local.LocalChannel$4.run(LocalChannel.java:261)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.channel.DefaultEventLoop.run(DefaultEventLoop.java:54)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at java.lang.Thread.run(Thread.java:745)
[13:03:10] :		 [io.netty:netty-codec-http2] Caused by: java.nio.ReadOnlyBufferException: null
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.ReadOnlyByteBuf.capacity(ReadOnlyByteBuf.java:413)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.AbstractByteBuf.ensureWritable0(AbstractByteBuf.java:284)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.AbstractByteBuf.ensureWritable(AbstractByteBuf.java:265)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1068)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1060)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1050)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.WrappedByteBuf.writeBytes(WrappedByteBuf.java:772)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.AdvancedLeakAwareByteBuf.writeBytes(AdvancedLeakAwareByteBuf.java:589)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.buffer.WrappedByteBuf.writeBytes(WrappedByteBuf.java:772)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.handler.codec.ByteToMessageDecoder$1.cumulate(ByteToMessageDecoder.java:92)
[13:03:10] :		 [io.netty:netty-codec-http2] 	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:246)
[13:03:10] :		 [io.netty:netty-codec-http2] 	... 20 common frames omitted
[13:03:10] :		 [io.netty:netty-codec-http2] 13:03:10.955 [defaultEventLoopGroup-51-2] WARN  i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.

Good find! Is it valid for a transport to generate a read only buffer? This may cause issues in other aggregation code which also assumed no read only buffers will be generated by the transport. Typically the RecvByteBufAllocator is responsible for generating these buffers and existing implementations don't generate read only buffers. There is nothing technically wrong with generating read only buffers, but I'm worried that this may make LocalChannel less of a drop in when compared to Nio and Epoll.

@Scottmitch i think a handler can not assume it only gets writable buffers passed in as a user may place other handler before it and may produce read-only buffers in these. So I think there is no value to change the local transport here but we need to fix the aggregation code.

@trustin addressed which even simplifies it :)

Cherry-picked into 4.1 (38b054c65c) and 4.0 (32aa8f980d14977886c2c211e95ac0ab652f0afc)

lgtm


security vulnerabilities in dependencies are fixed

Coverage remained the same at 98.618% when pulling 15be107a8838cd30238825bf64bc0005fb0cb791 on rajaram5:develop into d80ae4446f3f847abfba140203fb3f9594f0c091 on DTL-FAIRData:develop.


[REQUEST]: Add support for a custom HTML blob.

My specific need is to use the generated index.html file as part of a server side rendering pipeline. Specifically, I'll need to bootstrap the page with JSON by replacing the text {model} in <script type="application/json">{model}</script> with a JSON blob.
My first idea was to enhance the scripts option to give special attention to an object with a content property. While content would be an invalid script attribute, it may still cause a backwards comparability issue if someone were emitting it for some purpose.
Example 1

{
  scripts: [
    {
      id: 'customData',
      type: 'application/json',
      content: '{model}',
    }
  ],
}

Generates
<script id="customData" type="application/json">{model}</script>

You could potentially maintain backwards comparability by detecting a special structure like:
Example 2

{
  scripts: [
    {
      attributes: {
        id: 'customData',
        type: 'application/json',
      },
      content: '{model}',
    }
  ],
}

In order to avoid any backwards compatibility issues and to create an option that meets even more use cases, this pull request opts to go a much more generic route by simply allowing the user to define an open ended block of HTML as a string via a new option called content.
Example 3

{
  content: '<script id="customData" type="application/json">{model}</script>'
}

I placed it right below the rendered appMountId divs, but I could see this being controversial as it does cater to my specific use case and other users may want it rendered in different locations. I also realize you may not want to go this route as it deviates from the prescriptive/structured nature of the current template. Either way, I hope you understand the need and perhaps we can come up with a more ideal solution. Otherwise I can always customize it on my side. Thanks!

Yeah, you're right: I'm not sure what to do with this feature. :)  If the user wants to create their own template, they can do that.  This template lib was initially to provide the few most common options that I needed in my template that didn't exist in the default.  As more people have used the project, the more use cases have been discovered for the cool projects people are building.  This feature almost brings it full circle, allowing the building of your own template within some subsection of the template.
For this reason, I'm hesitating on adding it, because it detracts from what is perhaps the main reason to use this template: so you don't have to roll any html in your single page app project.
But for another reason -- providing an escape hatch to put whatever you want in this template that has other good things -- I'm tempted to add it.
I'm interested, @BrandonBoone, after having this sit for a while, what are your current-day thoughts as they've evolved for a couple weeks?

Right now I'm using a local copy of the template with the custom content feature from Example 3 above, but I'd personally prefer something more inline with Example 1 or 2. My immediate need is basic enough that it could be covered by a much simpler configuration option, and the custom HTML in my webpack.config looks a bit sloppy.
While a generic escape hatch is super useful, it's difficult to implement because you don't know what the end user is trying to accomplish. Do they want to customize the header, or put something at the top/middle/bottom of the body, etc.? I'm not sure what the answer is, but my only other idea is to somehow daisy chain templates together.
Example pseudo code
Simple static file to override and customize. The values of the replaceable tokens ({htmlWebpackPlugin.*}) are generated from the existing template.ejs file and merged with this one during final rendering.
{htmlWebpackPlugin.prefix}
<html>
  <head>
    <!-- Put whatever you want here -->
    {htmlWebpackPlugin.head.meta}
    <!-- Put whatever you want here -->
    {htmlWebpackPlugin.head.base}
    <!-- Put whatever you want here -->
    {htmlWebpackPlugin.head.link}
    <!-- or just
    {htmlWebpackPlugin.head}
    -->
  </head>
  <body>
    <!-- Put whatever you want here -->
    {htmlWebpackPlugin.body}
    <!-- Put whatever you want here -->
  </body>
</html>

The default setup would provide both templates, but allow you to override the simpler of the two through configuration.
new HtmlWebpackPlugin({
  template: require('html-webpack-template')('./myOverrides.htm'),
  //...
});

You still don't have the ability to customize what happens within any of the {htmlWebpackPlugin.*} tokens, but you gain a lot more flexibility without having to customize the entire template and incur the cost of maintaining it separately. I have no idea the what the feasibility or cost of this setup would be, so please consider the general idea over the exact implementation details.
Like I said though, for my setup I'd rather go with something from Example 1 or 2, but for a generic escape hatch I think you'd need a system that's more flexible than the one I initially proposed.

@BrandonBoone Thanks for your thoughts.  Lots of good details on tradeoffs and how you've been thinking about it.  I'm glad you have something working so you don't feel blocked.
I don't feel great about going forward with this feature at this point.  It feels a bit more custom than I want this to be.  Contributions as a whole are tending that way, however, so maybe someday I'll reopen this.  Closing for now.  Thanks for your input here.


vertical distribution action behaves weird

Without digging deep it seems that distributing vertically isn't quite correct.

First off, AFAIK it should distributing within common bounding box, but it tends to distribute some elements outside.
Related to previous point, executing the action several times in a row keeps changing the distribution. The action should be idempotent.

Repro: https://excalidraw.com/#json=6328897570340864,8r03Rmf9N3139NloxmHpBA (execute vertical distribution action several times)
/cc @steveruizok

Here as well.. click multiple times on distribute horizontal or vertical..
https://excalidraw.com/#json=5754487973085184,ELjQNaO5MgigYK1ON4WlmA

Hey, looking into this now. It's actually a tricky question: how to handle distributing space when the gaps are negative. Just to show that we're in good company, here's the same bug in Figma.

I think I have a solution, adapted from draw.io's distribute pattern. But it also has a bug that shows up when the box that defines the bottom bounds is not also the last box in the sort order. (For a vertical group, that would be when the box with the greatest maxY is not also the box with the greatest y.)

Inkscape also has this bug, but it's less clear in that case that it is a bug: they have different options for distributing space between items—which will change the overall bounding box—as well as distributing space between centers, which I think is what we're actually after, and seems to be the approach that draw.io uses.

Yea, I agree it's hard to even figure out conceptually what we want it to do. Maybe nothing when the gaps are negative.

Maybe nothing when the gaps are negative.

Or putting them centrally.. so at least we are doing something with them... equally from the center. (Center horizontally / Center vertically)

I was thinking the same @lipis: distribute centers as a fallback.
But the problem isn't actually when gaps are negative: it's when the item at the end of the sort isn't defining the bottom of the bounding box. The example below has a positive step but will still produce the bug.

This can be fixed by sorting by middle points (midX or midY) rather than min points (x or y).

This can be fixed by sorting by middle points (midX or midY) rather than min points (x or y).

Sounds good. What are the cases where it'll end up in a suboptimal distribution?

Sometimes a negative gap is stable, sometimes it isn't. 🤯 Here I've just moved the red box a bit lower down.

Ok, I think I've got it. https://github.com/excalidraw/excalidraw/pull/2415


TCP testing problem in zperf sample using stm32f746g_disco

Describe the bug
TCP benchmark as described in zperf sample documentation reports low transfer rate abd errors on stm32f746g_disco, while UDP test works, and gives 30Mbps result. I am referring to the scenario where Zephyr acts as a client, while Linux host runs the iperf server.
What have you tried to diagnose or workaround this issue?
I tried to tweak CONFIG_NET_BUF_TX_COUNT, CONFIG_NET_PKT_TX_COUNT and NET_BUF_DATA_SIZE Kcoinfig values.
To Reproduce
Steps to reproduce the behavior:

set correct IP addresses in zephyrproject/zephyr/samples/net/zperf/prj.conf. In my case:

CONFIG_NET_CONFIG_MY_IPV4_ADDR="<IP_ADDRESS>"
CONFIG_NET_CONFIG_PEER_IPV4_ADDR="<IP_ADDRESS>"

cd zephyrproject/zephyr
west build --pristine -b stm32f746g_disco samples/net/zperf/
west flash
Connect the nucleo board to a router.

On the host (IP <IP_ADDRESS>) run iperf:
iperf -s -p 5001 -B <IP_ADDRESS>

On the Zephyr target run zperf as so:

uart:~$ zperf tcp upload2 v4
Connecting to <IP_ADDRESS>
Duration:	1.00 s
Packet size:	256 bytes
Rate:		10 kbps
Starting...
New session started
There was 4 network buffer allocation errors during send.
Consider increasing the value of CONFIG_NET_BUF_TX_COUNT and
optionally CONFIG_NET_PKT_TX_COUNT Kconfig options.
-
Upload completed!
Duration:	4.00 s
Num packets:	11
Num errors:	4 (retry or fail)
Rate:		5 Kbps
[00:17:30.743,000] <err> net_pkt: Data buffer (304) allocation failed.
[00:17:31.744,000] <err> net_pkt: Data buffer (304) allocation failed.
[00:17:32.744,000] <err> net_pkt: Data buffer (304) allocation failed.
[00:17:33.744,000] <err> net_pkt: Data buffer (304) allocation failed.

On the Linux host use iperf (2.0.13) as so:
iperf -s -p 5001 -B <IP_ADDRESS>
------------------------------------------------------------
Server listening on TCP port 5001
Binding to local address <IP_ADDRESS>
TCP window size:  128 KByte (default)
------------------------------------------------------------
[  4] local <IP_ADDRESS> port 5001 connected with <IP_ADDRESS> port 5001

After increasing CONFIG_NET_BUF_TX_COUNT to 128 (as suggested by zperf) and increasing NET_BUF_DATA_SIZE to 1024 and CONFIG_NET_PKT_TX_COUNT to 16 the errors reported changed a little bit.
uart:~$ zperf tcp upload2 v4

Setting IP address 2001:db8::1
Setting destination IP address 2001:db8::2
Setting IP address <IP_ADDRESS>
Setting destination IP address <IP_ADDRESS>

Connecting to <IP_ADDRESS>
Duration:	1.00 s
Packet size:	256 bytes
Rate:		10 kbps
Starting...
New session started
There was 1 network buffer allocation errors during send.
Consider increasing the value of CONFIG_NET_BUF_TX_COUNT and
optionally CONFIG_NET_PKT_TX_COUNT Kconfig options.
-
Upload completed!
Duration:	1.00 s
Num packets:	19
Num errors:	1 (retry or fail)
Rate:		37 Kbps

Expected behavior
When tests are run using UDP protocol, the results are much higher (~30Mbps). I would assume TCP test without any error, and should give better speeds than 5Kbps or 37 Kbps. Below is the output from UDP test:
uart:~$ zperf udp upload2 v4 10 1K 50M
Connecting to <IP_ADDRESS>
Duration:	10.00 s
Packet size:	1024 bytes
Rate:		51200 kbps
Starting...
Rate:		50.00 Mbps
nb_packets=3707	delay=0	adjust=-26366
nb_packets=7400	delay=0	adjust=-19878
nb_packets=11093	delay=0	adjust=-20327
nb_packets=14786	delay=0	adjust=-27277
nb_packets=18477	delay=0	adjust=-26586
nb_packets=22168	delay=0	adjust=-26483
nb_packets=25859	delay=0	adjust=-19589
nb_packets=29550	delay=0	adjust=-26585
nb_packets=33244	delay=0	adjust=-20369
-
Upload completed!
LAST PACKET NOT RECEIVED!!!
Statistics:		server	(client)
Duration:		67.56 m	(10.00 s)
Num packets:		0	(36940)
Num packets out order:	1
Num packets lost:	74559
Jitter:			43.00 m
Rate:			0 Kbps	(28.85 Mbps)

At the same time, the output on on the host:
iperf -s -p 5001 -B <IP_ADDRESS> -u
------------------------------------------------------------
Server listening on UDP port 5001
Binding to local address <IP_ADDRESS>
Receiving 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local <IP_ADDRESS> port 5001 connected with <IP_ADDRESS> port 5001
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-10.1 sec  46.1 MBytes  38.3 Mbits/sec   0.020 ms    0/47171 (0%)

Impact
I have problems when sending big chunks of TCP data (from Zephyr to a host) at once using sockets. I've tried to stream 160x120 static video stream from stm32f746g_disco to the Linux host running gst-launch as can be seen in samples/video/tcpserversink example. This example sends relatively big amounts of data from the Zephyr target to a host, just like zperf tests described above. I lowered the resolution to prevent memory depletion, and observed very unstable behavior. gst-launch would exit after 0.3s saying that stream was cut, and Zephyr would say hat the peer closed the connection. Then when I risen various log levels to debug which caused the log to flood, I could see a few seconds of "static" video capture.
Environment (please complete the following information):

OS: Manjaro
Toolchain : Zephyr SDK
Commit SHA or Version used : commit 9be1ba9e0875f4baaa990dd36326a1d60270e621

There is also report about poor TCP performance #23302


More packaging: v8stdint.h clash

The v8stdint.h header is used in multiple packages, and creates collisions in large namespaces like Debian. Furhermore, this file is not really needed on any linux systen, since these have stdint.h available.
Enclosed patch drops v8stdint.h from package on hosts having stdint.h available, thus resolving this issue.
0001-Avoid-using-v8stdint.h-unless-needed.patch.gz

Please consider a pull request instead of a patch file: https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request
Also, v8stdint.h is used conditionally on Windows only, so it should never cause an issue with Debian:
https://github.com/wjwwood/serial/blob/cbcca7c83745fedd75afb7a0a27ee5c4112435c2/include/serial/v8stdint.h#L39
I'll close this since I cannot take a patch file (no git author, etc).

The problem is not the usage, the problem is the very existence of this file which typically goes int /usr/include, creating collisions with other packages.
The patch is a git patch, you can use git  -am which brings you author, date  etc. I was admittedly lazy, the debian packaging lives on gitlab...

I see, given this is a very background project for me, I still don’t see me taking it without a pull request. But the patch is useful for others that stumble here. Thanks!


curl command does not follow redirects

The current implementation of the curl command does not include the -L option to follow redirects. This behavior is causing issues with some Zero Trust integrations, which rely on handling redirects correctly to function properly.

I do not need this actually.


pull request action on bitbucket label error

testing the prerelease containing the pull request action, there's something wrong with the label, pls see screenshot
https://github.com/markiewb/nb-git-open-in-external-repoviewer/blob/master/src/main/java/de/markiewb/netbeans/plugin/git/openinexternalviewer/PullRequestAction.java#L19

Thank you Milos. Should be fixed. https://github.com/markiewb/nb-git-open-in-external-repoviewer/releases/tag/v<IP_ADDRESS>-SN


Webpack configuration no longer supports mocking Node.js modules

Bug report
What is the current behavior?
Webpack configuration no longer supports mocking Node.js modules. Currently, an error is thrown:
Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.
 - configuration.node should be one of these:
   false | object { __dirname?, __filename?, global? }

It looks like the schema used to validate webpack.config.js is too restrictive.
If the current behavior is a bug, please provide the steps to reproduce.

Sample webpack.config.js : https://gist.github.com/adarshbhat/3ec5950b66b78102da0cf46e51a3d633
Use a module that does a require('fs')

What is the expected behavior?
If webpack.config.js has specified node: { fs: 'empty' }, then an empty object should be returned when require('fs') is called.
Currently, running webpack throws a validation error. It looks like the schema used to validate webpack.config.js is too restrictive.
Relevant documentation is here: https://webpack.js.org/configuration/node/#node

Other relevant information:
webpack version:  5.1.0
Node.js version: 14.5.0
Operating System: Windows 10
Additional tools: NA

As you might find in the document https://webpack.js.org/configuration/node/#node only support three properties including global, __filename and __dirname.
What you need here could be https://webpack.js.org/configuration/resolve/#resolvefallback:
{
  resolve: {
    fallback: {
      fs: false
    }
  }
}

But I haven't tested it yet.

Thank you for your response. I will try out your recommendation.

@chenxsan Your recommendation worked! Thank you so much.


Update to nrfx 3.7.0 and add support for nRF54H20 EngB

The following west manifest projects have been modified in this Pull Request:

Name
Old Revision
New Revision
Diff

hal_nordic
pull/225/head
https://github.com/zephyrproject-rtos/hal_nordic/commit/ee6213b6cfcd7fdc10f7ec3a4f7f37f35dfa5343
<EMAIL_ADDRESS>

nrf_hw_models
https://github.com/zephyrproject-rtos/nrf_hw_models/commit/d2a119a9c7600ce06033a794de042e0ad9a38702
https://github.com/zephyrproject-rtos/nrf_hw_models/commit/bf8e45bd1f870e49cc15392e045c28d54ea12285
<EMAIL_ADDRESS>

Note: This message is automatically posted and updated by the Manifest GitHub Action.


Camera ZWO Black&White

Hi all,
I have no AllSky camera for the moment, but I am very interested by this project.
In section "Requirements", you have listed many cameras and mainly Color Cameras (ASIxxxMC).
Is it possible to use a B&W camera as ASI178MM?
In this case, for configuration in the file "settings.json" for:

type (0=RAW 8 bits, 1=RGB 24 bits, 2=RAW 16 bits): You choose between 0 or 2?
wbr et wbb (these are the intensities of the red and blue components of the image): For B&W camera (0 or empty)?
For the connection to a PC/server, is it possible to use a cable or only the Wifi?
Sorry for these questions.
Have a nice day.
Robert from Toulouse (south west of France).

Hi
I use a ASI178MM in Raw16 and all works great, there is an issue I have with the Keogram and Startrails being white but I have not had chance to investigate and fix this yet. In RGB24 everything works great.
You can see some of the results here https://alexjg.co.uk/allsky/
Cheers
Alex

Hi Alex,
Thanks a lot for your answer.
I went to see you website and for example for the section "Archived Startrails", you have White pictures, after B&W pictures and blue pictures. What did you change between B&W pictures and blue pictures ?
A+
Robert

Robert
Originally I was using an ASI 120MC but stopped using it as the image quality was not very good. I swapped to the ASI 178MM which, apart from the start trails issue, is a much better camera for me.
When I get a few mins I will look at a fix for the white startrails on the 178

Thank a lot Alex for your answer.
A+
Robert


Azure Content Safety - Rate limiting

We may have an issue with rate limits on the azure content safety service. It looks like there may be as low as one transaction per second allowed to communicate with the service.

Appears addressed with full-paid service


[docs] Highlight active section in right navbar

docsy vs. mkdocs

@hiddeco Were you saying that you have a piece of code which basically does this already somewhere, or is my memory failing me?

There is one in the previous revision of the website, before moving to the Docsy theme.

Wasn't that in mkdocs?

No, I also implemented it in the rework of the site I made myself I think.

ok, cool

@hiddeco can you help me with finding or describing that code? I would like to close this ticket. It should not take long to write that code using IntersectionObserver WebAPI or a height calculation method like this: https://codepen.io/zbymhz/pen/ExjRNwZ

Can't seem to easily find it, but from what I remember it noticed IDs entering and leaving the viewport using an IntersectionObserver or something something.

The OpenFaas docs use mkdocs -it works there: https://docs.openfaas.com/community/


RD2: Persist Account on Opportunity when RD is updated

When the Recurring Donation is updated and its value synchronized with future Open Opportunities, the Account on Opportunities should match the Account on the Recurring Donation.
Critical Changes
Changes
Issues Closed
Community Ideas Delivered
New Metadata
Deleted Metadata

**lurch: attach W-039834

Tracking W-039834

@ravensisco , This PR is ready for testing!


Support traffic_calming=* in micromapping mode

Here's an idea: snapping new objects to roads. E.g. traffic_calming, barriers, crossings, milestones, passing places etc.

Done in 0.1.6.


Batch multiplication in the loss file

Hi,
Just a small question about some comments in the loss function. It is written "Keras has the annoying habit of dividing the loss by the batch size" to justify the multiplication at the end. But when I look at the code, to me, it seems like the multiplication is required because of the division by n_positive.
Correct me if I'm wrong but n_positive if the sum of all positive in the batch, thus, when dividing by n_positives you actually divide by "avg_n_positive * batch_size" and this requires the multiplication by batch_size afterwards to correct it.
Do you see any problems in this reasoning and if so where ?
Thanks,
Benjamin

The reasoning is exactly as stated in the inline comment: We need to multiply by the batch size to compensate for the fact that Keras subsequently divides by it. n_positive (N in the loss function in the paper), the number of all matched boxes across the whole batch, is the number by which we want to divide.

Ho, okay, got it, I read N as a per image value instead of a batch value (reading the paper again I find it to be really ambiguous regarding that part). Anyway, the comment makes sense when seeing it that way.
Thanks !


Refactor FooterHelper

Raises FooterHelper test coverage to 100%
Reduces FooterHelper#show_object_footer AbcSize from  82.84 to <= 17 (default)
Reduces FooterHelper#show_authors_and_editors AbcSize from  39.57 to <= 17 (default)
Fixes all other Rubocop offenses in FooterHelper

Coverage: 93.669% (+0.02%) from 93.652% when pulling<PHONE_NUMBER>d05c4597b11e1c810ca00c7ddda7b4 on jdc-footer_helper-refactor into 9cf0a640a1b554869642f84bca0f59b7736f2d08 on main.

Interesting! Thanks for that info.
I'll see if there are showable objects that lack created_at and/or
updated_at.
On Thu, May 18, 2023 at 12:37 PM andrew nimmo @.***>
wrote:

@.**** commented on this pull request.
In app/helpers/footer_helper.rb
https://github.com/MushroomObserver/mushroom-observer/pull/1510#discussion_r1198039920
:

def html_for_latest_version(obj)

latest_user = User.safe_find(obj.versions.latest.user_id)
html = html_created_by(obj)

if latest_user && obj.updated_at

 html << :footer_last_updated_by.t(user: user_link(latest_user),

                                   date: obj.updated_at.web_time)

elsif obj.updated_at

 html << :footer_last_updated_at.t(date: obj.updated_at.web_time)

end

html
end

def html_created_by(obj)
if obj.created_at

@JoeCohen https://github.com/JoeCohen IIRC there used to be objects
without a created_at, but that may not be the case anymore, and probably
should not be. I might have it confused with updated_at, though.
I have changes coming to the HTML generated in show_object_footer in
Boostrap 5, but i can adapt them to whatever refactor you do here.
—
Reply to this email directly, view it on GitHub
https://github.com/MushroomObserver/mushroom-observer/pull/1510#discussion_r1198039920,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAALDFDJEZM2N2SF5BLTIYTXGZF5BANCNFSM6AAAAAAYGSVIDY
.
You are receiving this because you were mentioned.Message ID:
@.***
com>

18054/181904 Comments have updated_at: nil. The most recent of these is from 2010.

We don't use footers with Comments. So this should have no effect on this PR.
@pellaea: Should we fix these? (I think so.)

My two cents: even if these should always be non-nil, I would be careful, because the consequence of being wrong is it will give a 500 error.  It used to be harmless to add sanity checks.  I assume that the problem is  nowadays such sanity checks come with the baggage of needing test cases.  But since these cases should never occur it is therefore impossible to test.  Does that about sum it up?  Clearly the easiest solution is to get rid of the check.  And if we don't actually care if MO throws 500 errors from time to time (and we get good at ignoring the cronjob email that tells us about these errors), then it's a win all around.  Unfortunately, if we do actually care about minimizing the frequency of 500 errors, we would need to track down and fix whatever resulted in these impossible conditions actually occurring.  But that is generally extremely challenging to do.  What are the trade-offs in time spent writing tests versus tracking down pathological events?  (Versus lowering our expectations of MO! :)

Thanks Jason!
I'll keep it as-is (with the checks for the supposedly
impossible conditions).
On Fri, May 19, 2023 at 10:20 PM Jason Hollinger @.***>
wrote:

My two cents: even if these should always be non-nil, I would be careful,
because the consequence of being wrong is it will give a 500 error. It used
to be harmless to add sanity checks. I assume that the problem is nowadays
such sanity checks come with the baggage of needing test cases. But since
these cases should never occur it is therefore impossible to test. Does
that about sum it up? Clearly the easiest solution is to get rid of the
check. And if we don't actually care if MO throws 500 errors from time to
time (and we get good at ignoring the cronjob email that tells us about
these errors), then it's a win all around. Unfortunately, if we do actually
care about minimizing the frequency of 500 errors, we would need to track
down and fix whatever resulted in these impossible conditions actually
occurring. But that is generally extremely challenging to do. What are the
trade-offs in time spent writing tests versus tracking down pathological
events? (Versus lowering our expectations of MO! :)
—
Reply to this email directly, view it on GitHub
https://github.com/MushroomObserver/mushroom-observer/pull/1510#issuecomment-1555429272,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAALDFCXUP5GUUUY7V3HFWTXHAS5ZANCNFSM6AAAAAAYGSVIDY
.
You are receiving this because you were mentioned.Message ID:
@.***>


self-sizing cells in 1.2

I was successfully using -[UICollectionViewFlowLayout estimatedItemSize] with 1.1.1, but in 1.2 I'm getting the following crash:
-[_UIFlowLayoutSection frameForItemAtIndexPath:] + 548, queue = 'com.apple.main-thread', stop reason = EXC_ARITHMETIC (code=EXC_I386_DIV, subcode=0x0)
    frame #0: 0x000000010da10fb3 UIKit`-[_UIFlowLayoutSection frameForItemAtIndexPath:] + 548
    frame #1: 0x000000010d9bfd31 UIKit`-[UICollectionViewFlowLayout _frameForItem:inSection:usingData:] + 159
    frame #2: 0x000000010d9ba53d UIKit`-[UICollectionViewFlowLayout layoutAttributesForItemAtIndexPath:usingData:] + 568
    frame #3: 0x000000010d9ba802 UIKit`-[UICollectionViewFlowLayout layoutAttributesForItemAtIndexPath:] + 409
  * frame #4: 0x000000010c1889ee iCanCope-cal`-[KTCenterFlowLayout layoutAttributesForItemAtIndexPath:](self=0x00007f9ac343b7b0, _cmd=<unavailable>, indexPath=<unavailable>) + 694 at KTCenterFlowLayout.m:68 [opt]
    frame #5: 0x000000010c188655 iCanCope-cal`-[KTCenterFlowLayout layoutAttributesForElementsInRect:](self=0x00007f9ac343b7b0, _cmd=<unavailable>, rect=(origin = (x = -568, y = -568), size = (width = 868, height = 1136))) + 245 at KTCenterFlowLayout.m:34 [opt]
    frame #6: 0x000000010d9db58a UIKit`__45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 144
    frame #7: 0x000000010d9dafd7 UIKit`-[UICollectionViewData validateLayoutInRect:] + 3067
    frame #8: 0x000000010d98753a UIKit`-[UICollectionView layoutSubviews] + 199
    frame #9: 0x000000010d1c2980 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
    frame #10: 0x0000000110843c00 QuartzCore`-[CALayer layoutSublayers] + 146
    frame #11: 0x000000011083808e QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 366
    frame #12: 0x0000000110837f0c QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24
    frame #13: 0x000000011082c3c9 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 277
    frame #14: 0x000000011085a086 QuartzCore`CA::Transaction::commit() + 486
    frame #15: 0x000000011085a7f8 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 92
    frame #16: 0x000000010f62ec37 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    frame #17: 0x000000010f62eba7 CoreFoundation`__CFRunLoopDoObservers + 391
    frame #18: 0x000000010f6247fb CoreFoundation`__CFRunLoopRun + 1147
    frame #19: 0x000000010f6240f8 CoreFoundation`CFRunLoopRunSpecific + 488
    frame #20: 0x0000000111f20ad2 GraphicsServices`GSEventRunModal + 161
    frame #21: 0x000000010d107f09 UIKit`UIApplicationMain + 171
    frame #22: 0x000000010c13903f iCanCope-cal`main(argc=3, argv=0x00007fff53cb5608) + 111 at main.m:14
    frame #23: 0x0000000110ac392d libdyld.dylib`start + 1
    frame #24: 0x0000000110ac392d libdyld.dylib`start + 1

I did notice that a section has been added to the readme stating that self-sizing collection view cells (estimatedItemSize) are not supported. But, the screenshot in the readme of the US states, clearly shows cells that have different widths. Is that example screenshot no longer possible in 1.2 and above?

@xinsight a few months late, but... yeah self-sizing cells don't work in this layout anymore. However, it is certainly possible to size "auto-layed-out" cells without estimatedItemSize. Check out an example intrinsic content size override here.


objectstores/volumesnapshotters: check for invalid keys in config

Signed-off-by: Steve Kriss<EMAIL_ADDRESS>Fixes #489

Changelog needed?

yep - added


Update requirements.txt

We want to make use of cheroot in here instead:
https://github.com/cherrypy/cheroot

Updating requirements to fix wsgiserver issue


Feature Description Box update

Is your feature request related to a problem? Please describe
Currently the description box has a limited small size and as a result when there is a bit long description to read it we need to scroll down , and as the description box size is so small it is hard to read the description also
Describe the solution you'd like
Currently there are 3 solutions are there to be proposed:

Simply add read more button and expand description box once clicked
change/update the page layout and bring the description box below the circuit preview so that it can take up whole screen width + read more button
add a modal to show the description when clicked on read full description button

Describe alternatives you've considered
feel free to propose any other solution or maybe updates to the already proposed solution
Additional context
NOTE: don't start asking the issue to be assigned until a solution is decided and the mentors approve it
Are you working on this?
No

I think we should go with either modal or read more button
but can you share process of regenerating this issue,
I wanted to work on this

I think a read more button or modal.
If the content is long then a read more button offers a minimalistic approach and makes the page less cluttered .
A modal on the other hand provides a more immersive user exp and also makes the website a bit modern in my opinion.

I would like to work on this issue.


Reduce duplication in NetworkManager

See each commit.

Rebased, ping for review.

Rebased, ping for review.


How to use AsyncCommand canExecuteChangedFactory?

I'm trying to use pre3 and it seems that I cannot pass a simple function any more as the the second parameter for the AsyncCommand as you have suggested here: https://github.com/StephenCleary/Mvvm.Async/issues/11#issuecomment-259687116
What is the expected way of using the factory in pre3 release?

The factory is a specific implementation of the CanExecuteChanged event (not it's logic).
The current AsyncCommand class always ties CanExecute to IsExecuting. If you need different logic, you'd need to derive a custom type from AsyncCommandBase.
Hope this helps,
-Steve

Thanks for the hint. I didn't understand that from the comments.
So this means that if a command shall only execute on a certain pre-condition you would expect a new property to be introduced and that bound to the IsEnabled property in the XAML?
bool CanExecuteCommandX => !AsynCommandGenerateX.IsExecuting && otherCondition
That seems overly cumbersome and against most examples and books about WPF and the Command parameter.

It's overly cumbersome and sort of against the idea of even taking delegate arguments if I have to derive a new type to support CanExecuteChanged.


feature: command for cli to check if migrations matches up with the actual db, not just the history

Would be awesome to do complete db checks against the snapshot generated by the migrations process to actually check if the db is what it should be like from the cli.
I guess it's possible from code per this SO: https://stackoverflow.com/questions/13089448/how-to-check-if-database-schema-matches-entity-framework-schema

@ruant This kind of scenario is being tracked by issue #831. We're not planning to do anything outside of what is already covered there.


Run all tests without early exit

After adding junit report to daily release jobs, we see similar issue encountered before such as failures masked by go-junit-report since its exit status is zero. We generate the junit report and handle issue as such in the makefile so the best approach is to call make to trigger the test. I changed EXTRA_E2E_ARGS to be configurable so we still have full control on the flags we use for the release.
Also ensure that we finish all the tests without stopping early on nonzero status.

/assign @sebastienvas @rkpagadala @mattdelco @costinm

/lgtm

@chxchx: The following test failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/e2e-simpleTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-simple

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@chxchx: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/e2e-simpleTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-simple

prow/e2e-bookInfoTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-bookInfo

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@chxchx: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/e2e-simpleTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-simple

prow/e2e-bookInfoTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-bookInfo

prow/istio-pilot-e2e.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test istio-pilot-e2e

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@chxchx: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/e2e-bookInfoTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-bookInfo

prow/istio-pilot-e2e.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test istio-pilot-e2e

prow/e2e-simpleTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-simple

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@chxchx: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/istio-pilot-e2e.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test istio-pilot-e2e

prow/e2e-simpleTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-simple

prow/e2e-bookInfoTests.sh
c0d74c08e7b1c881dca5b634e37a208680dcf30f
link
/test e2e-bookInfo

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.


make add_subdirectory fails

Using add_subdirectory(units) results in the following:
CMake Error at submodules/units/CMakeLists.txt:30 (include):
  include could not find load file:

    common/cmake/scripts

CMake Error at submodules/units/CMakeLists.txt:33 (conan_init):
  Unknown CMake command "conan_init".

Hi, thanks for reporting. Did you clone the whole repo with its submodules?

Closing it as no feedback from the submitter received.


move directly to contribution guide

#355 as was discussed here.

Thanks :octocat:
Your commit did it to the master branch and the change should be deployed in a matter of minutes.


New package: SMARTTechnologies.SMARTNotebook version 24.0

Pull request has been created with komac v2.3.0 :rocket:
Microsoft Reviewers: Open in CodeFlow

Automatic Validation ended with:

Installation failed with exit code -1978335229
2024-07-11 00:25:32.290 [CLI ] Caught std::exception: bad allocation

(Automated response - build 886.)

Manual Validation failed during or immediately after the download.

Automatic Validation ended with:

Installation failed with exit code -1978335229
2024-07-11 21:23:29.501 [CLI ] Caught std::exception: bad allocation

(Automated response - build 886.)

Verify:

Hi @PckgrBot,
This package seems to present 3 different version numbers in different places. Since this application displays version 22.2 (24.0.1733.0) but writes to the Registry 24.0.306.0, it should probably have a DisplayVersion. If the version number in parentheses matched the Registry, I'd give it a pass.


unbundle the data since we now download otf

Coverage remained the same at 72.5% when pulling e254cedb66f25490df083b68f70b8b1b92c4fc9c on phobson:unbundle-data into 18d9c360f3e3540a0b6d2884347a8c6e14bc096b on Geosyntec:master.


[roles-0.1.0] - Role details mobile drawer

This PR implements Role details mobile drawer.
Note - all of that is not a real data.
Testing:

To access this screen - just visit any DAO's "Role Details" page, for example /roles/details?dao=sep:0x27651f403E43C890b73802c2ea59b7ffaFe96E00&hatIndex=0
For now - hatIndex value doesn't matter for displaying, but it is hooked up into navigating to proper "Edit Role Details" path.
Closing drawer should take you to the proper DAO "Roles" page (most likely empty right now).

See screenshot

Empty state should be below the table header

Browser metadata
Path:      /roles/edit?dao=sep:0x790E707146b92E1cD95DDe866D5A58939447C8C2
Browser:   Firefox 127.0 on Mac OS 10.15
Viewport:  1680 x 912 @2x
Language:  en-US
Cookies:   Enabled

Open in BrowserStack

Open Deploy Preview · Mark as Resolved

Can't exit side-peek drawer by clicking away from it (or pressing escape), when there isn't any content added to the inputs.

Browser metadata
Path:      /roles/edit?dao=sep:0x790E707146b92E1cD95DDe866D5A58939447C8C2
Browser:   Firefox 127.0 on Mac OS 10.15
Viewport:  1680 x 912 @2x
Language:  en-US
Cookies:   Enabled

Open in BrowserStack

Open Deploy Preview · Mark as Resolved

After role has been created, re-opening the side-peek drawer and clicking away without hitting "Save" deletes the role from the list.

Browser metadata
Path:      /roles/edit?dao=sep:0x790E707146b92E1cD95DDe866D5A58939447C8C2
Browser:   Firefox 127.0 on Mac OS 10.15
Viewport:  1680 x 912 @2x
Language:  en-US
Cookies:   Enabled

Open in BrowserStack

Open Deploy Preview · Mark as Resolved

@mudrila I've got no way to scroll and no visible Save button on mobile.

Experiencing the same inability to scroll or interact with the tabs on Roles page in Safari + MetaMask
Browser metadata
Path:      /roles/edit/details?dao=sep:0xAB2f1779F230727CA62238df253B003C46c45d83&hatIndex=0
Browser:   Mobile Safari 17.5 on iOS 17.5.1
Viewport:  393 x 659 @3x
Language:  en-US
Cookies:   Disabled

Open in BrowserStack

Open Deploy Preview · Mark as Resolved


test: fixed TestPrettyDiff on tip

Internal changes to how the time.Time type works required this fix. Should be a
better anyways since it's no longer relying on unspecified behavior of
time.Time{}.

Coverage decreased (-1.4%) to 91.364% when pulling 5ac08c3d93c24f6c9b037456a273bb67cd672635 on fix-time-test into 7b706999d935b04cf2dbc71a5a5afcbd288aeb48 on master.


[mlx-ui] Add secret for login

Use secret object to store configuration for the login.
Also add session key into the secret object and use it
as an EVN variable for mlx-ui.
Signed-off-by: Yihong Wang<EMAIL_ADDRESS>

/lgtm


etcdserver: Fix v2v3api set to create parent directly if not exists

When a new file is created under an non existent directly,
the v2 API automatically create the parent directly.
This commit aligns the behaviour of v2v3 emulation to comply with the v2
API.
Fixes #9609

Include a test?

I think we should run the integration tests for the v2 api against the v2v3 emulated endpoint. I'll try to do so.
Le me know if you want unit tests for the v2v3 emulation layer.

@yudai Just simple unit test in v2store package would be great. https://github.com/coreos/etcd/blob/master/etcdserver/v2store/store_v2v3_test.go
Thanks!

@gyuho Thanks for the pointer. I added a unit test.

Created a separate PR for integration test enhancement, because it can take some time to complete.


MSBuild-integrated Markdown linting for .NET projects

(I'd have opened a Discussions thread for this if that feature would be enabled. Sorry if this is not a good place for such show and tell announcements.)
Something curious you might like: In our Lombiq Node.js Extensions project we've added Markdown linting, utilizing markdownlint too, in a way that it automatically runs as part of an MSBuild build process. This means that for .NET projects, lining for Markdown files happens automatically, as part of the normal build, and you get linter errors as build errors. This is how .NET static code analysis works as well, so this way, Markdown linting fits seamlessly into the .NET developer experience. See docs here.
What do you think?

This sounds awesome! If you want to send a PR to add a link to the "Related "section of the README, that may help spread the word. (Please have a look at CONTRIBUTING.md before doing so.)

Great idea, thanks, will do that.


Once chromecasts found, there not found a 2nd time

Hi,
When I find chromecasts for the first time everything is great, however when I restart the app I never find any.
If I remove the chromecast from the tv for a while and reinsert it, I can find them again.
Am I missing something here or is this an issue ?
Kevin :(

Hey,
Do you mean if you do the search again it does not find it? or that if you close the application and start it again it does not find it?
There should not be any this kind of issues.

Hi,
I tested again today with my own app, the sample UWP app and 2 different Chromecasts.
On the first and 2nd run (debugging is VS) I could see the devices  (even picks up the Fire stick), however after 20 minutes (Didn't search during this time) I was unable to find the devices.
I reset my router and both Chromecasts obtained a new IP Address, I was able to search for them again.
Using the Google Home app I was able to see the devices ok, however it said "Linked devices" which made me wonder if the issue is something by design by google
Should I be storing the Chromecast details in a database after ive successfully located them then creating a new Chromecast object with the DeviceUri?
Thank you

Is there any update on this ?

Hey,
No there is no need to build a local cache/database with results.
This code:
ObservableCollection<Chromecast> chromecasts = await ChromecastService.Current.StartLocatingDevices();
Should always return all the chromecasts that are found on the network. If this code doesn't give you the chromecast back on the 2nd run then it is really weird. If that happens could you check if the chrome browser on your desktop still sees them when it happens?

Could not reproduce the problem


refactor: decouple pod labels from selector labels

prometheus pods can not be rolled out without downtime when label's are changed
Fixes #3120

@brancz Hey here is my try to fix the issue that we talked about, if you could check this out and review this I'd appreciate it if I've solved the problem!
thanks


Updating sample to newest APIs.

Mostly changing override color to create the proxy meshes using the new way to highlight and making use of the enumNodeChildren/enumNodeFragments APIs to loop through the node hierarchy.

Hold this until the staging version ships though.


Possible to use HTML entities inside "loadMessage" value?

Inside loadMessage, I want to use HTML entities like e.g. ….
Unfortunately, when doing so, the … is printed literally on my HTML page, instead of the expected ….
My question:
Is there any way to use HTML entites and have them rendered correctly?

You could try to encode this character using the \u code. E.g. "\u2026"

That does work, thanks a lot!


[Fix]- Footer Alignment and Position Issues

This PR addresses several issues related to the footer's appearance and behavior across different pages with varying content amounts. The changes improve user experience by ensuring the footer stays aligned and positioned correctly.
Fixes #231
Changes Implemented:
1.Footer Alignment:
-Adjusted the structure and layout to ensure all footer elements (logo, text, links, social icons) are properly aligned.
The logo and "Code Social" heading are now in the same row with balanced spacing, improving visual appeal.
2.Remove Extra Space Below Footer:
-Fixed the CSS to ensure the footer stays at the bottom of the page even when there's not enough content. This prevents the footer from floating in the middle of the screen.
3.Improved Logo and Heading Layout:
-Corrected the alignment between the logo and the "Code Social" heading, ensuring a cleaner look.
Screenshots:

please resolve the merge conflicts

@Rizwan102003 Resolved conflict

@SaurabhS55 @pulkitpathak99 check this and please put the labels here


fixed 'Call to a member function getFormType() on a non-object'

When does it happen?

If you try to load an invalid step, for example _configurator/step/2.

Thank you @ChiarilloMassimo.


nodetype = int

Is there a problem with using an edgelist with strings instead of integers? I've made a couple of tests, using an edgelist such as:
a b 0.2
a c 0.1
b a 0.2
a d 0.3
....
and removing nodetype = int in read_edgelist, and it seems to work fine.

Hi,
Does it work fine for strings that aren't of length 1? Like 'abcxyz def'. In my case I'm getting only random single characters as my node_ids in my embedding output, instead of the node names as I had expected.


[meta] add slack notifications to CI jobs

This commit add Slack notifications to Elastic Release team Slack channel for helm-charts branch and staging job templates.
This should be backported to 6.8, 7.8 and 7.9 release branches

backported to 6.8, 7.8and 7.9 branches


Port batch-llm template to OA notebook format

When this is done, you can make a PR to add to OA homepage, cc me and @cristianjd for review.
Can follow changes here: https://github.com/anyscale/product/pull/26727/files as an example

Per offline discussion, we plan to replace the existing "batch inference basis” template with this. Some additional changes needed for this template:

parameterize all configs (GPU type, vLLM parameters, etc) for common models.
add a link to the OSS "batch inference" doc for reference


gpu_options doesn't work

Please make sure that this is a bug. As per our GitHub Policy, we only address code/doc bugs, performance issues, feature requests and build/installation issues on GitHub. tag:bug_template
System information

Have I written custom code (as opposed to using a stock example script provided in TensorFlow):  Yes
OS Platform and Distribution (e.g., Linux Ubuntu 16.04): Ubuntu 16.04, Ubuntu 18.04
Mobile device (e.g. iPhone 8, Pixel 2, Samsung Galaxy) if the issue happens on mobile device:
TensorFlow installed from (source or binary): pip install way
TensorFlow version (use command below):
pip install tensorflow-gpu==1.12.* and
pip install tensorflow-gpu==1.14.*
Python version: python 3.6
Bazel version (if compiling from source):
GCC/Compiler version (if compiling from source):
CUDA/cuDNN version: tf1.12 with cuda9, tf1.14 with cuda10
GPU model and memory: ubuntu 16.04 with 12G, ubuntu 18.04 with 24G

You can collect some of this information using our environment capture
script
You can also obtain the TensorFlow version with: 1. TF 1.0: python -c "import tensorflow as tf; print(tf.GIT_VERSION, tf.VERSION)" 2. TF 2.0: python -c "import tensorflow as tf; print(tf.version.GIT_VERSION, tf.version.VERSION)"
Describe the current behavior
I used the codes in AdaNet like
GPU_OPTIONS = tf.GPUOptions(allow_growth=True)
CONFIG = tf.ConfigProto(gpu_options=GPU_OPTIONS)
sess = tf.Session(config = CONFIG)

But it still occupied the whole gpu memory when I run the AdaNet. For example:
(1) If there is only 4G memory left, it will occupied the remaining 6G memory
(2) If there is no other process occupying the GPU memory (i.e., there is 10G memory left), it will occupied the whole 10G memory when I run the AdaNet.
So I think it doesn't need 10G to run but it takes that much any way.
Describe the expected behavior
I expect it only takes the memory it needs, instead of taking all of them. Therefore, I could make use of the 10G GPU memory better.
But now, I have no idea how to fix this issue. Could anybody please give me some suggestions? Thanks a lot.
Code to reproduce the issue
Provide a reproducible test case that is the bare minimum necessary to generate the problem.
I used the codes there AdaNet and change all "tf.Session()" to "tf.Session(config=CONFIG)" with codes as I mentioned before.
Other info / logs
Include any logs or source code that would be helpful to diagnose the problem. If including tracebacks, please include the full traceback. Large logs and files should be attached.

You need to put the gpu configuration on top of your code.
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
# Your model
  . . .
  . . .

Can you please confirm if this was the case? Thanks!

You need to put the gpu configuration on top of your code.
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
# Your model
  . . .
  . . .

Can you please confirm if this was the case? Also can you please point me to example you tried?Thanks!

Yes, that's exactly what I did. Didn't work

The codes I used is here AdaNet, to be specific, the codes I got by "pip install adanet==0.5.0". Since AdaNet has been updated, AdaNet 0.5.0 will have some differences, compared with AdaNet.
Besides, I changed all the original "sess = tf.Session()" inside to "config, ... , sess=tf.Session()". The files involving "tf.Session()" are "core/ensemble.py", "core/estimator.py", and "subnetwork/generator.py".
I put codes as follows in the beginning of each file, like:
from __future__ import ...
import ...

GPU_OPTIONS = tf.GPUOptions(allow_growth=True)
CONFIG = tf.ConfigProto(gpu_options=GPU_OPTIONS)

def ....
class ...

    with tf.Session(config=CONFIG) as sess:
        # codes

Another way is
from __future__ import ...
import ...

config = tf.ConfigProto()
config.gpu_options.allow_growth = True

...
with tf.Session(config=config) as sess:
    ...

I tried both and none of them worked. If there is still ambiguity, please tell me to be specific. Thank you so much for help!

As for the examples I tried, it refers to A Simple Example using AdaNet
Please modify some of them as follows:
from core_estimator import Estimator as MyEstimator  # I did some modification based on AdaNet
from core_evaluator import Evaluator as MyEvaluator   # I did some modification based on AdaNet
...
ADANET_ITERATIONS = 7  ##@param {type: "integer"}
max_iteration_steps = TRAIN_STEPS // ADANET_ITERATIONS

estimator = MyEstimator(
            head=head,
            subnetwork_generator=my_simple_dnn.Generator(
                feature_columns=feature_columns,
                optimizer=tf.train.RMSPropOptimizer(learning_rate=LEARNING_RATE),
                seed=RANDOM_SEED),
            max_iteration_steps=temp_stp,
            evaluator=adanet.Evaluator(input_fn=eval_input_fn, steps=None),
            config=make_config(this_experiment))

It doesn't work for me either, have you found the solution?

It doesn't work for me either, have you found the solution?

Nope. If I did, I wouldn't open this issue

I cannot reproduce this issue with 1.15.0rc2. Here is what I did:
$ pip install tensorflow-gpu==1.15.0rc2
$ python
>>> import tensorflow as tf
>>> GPU_OPTIONS = tf.GPUOptions(allow_growth=True)
>>> CONFIG = tf.ConfigProto(gpu_options=GPU_OPTIONS)
>>> sess = tf.Session(config = CONFIG)

I'm using a Titan-V GPU. After running the above command, only 319MiB out of 12066MiB is used based on nvidia-smi.
Could you try with the above commands?

Did you use the AdaNet codes that I mentioned before? This issue happens when I use AdaNet models, involving some modifications of course, but I think all you need to modify is those related to "sess = tf.Session()", by replacing them with "sess = tf.Session(config=config)". I will explain that in detail in the following.
To be clear, I get the AdaNet codes by "pip install adanet==0.5.0". Then I changed all the original "sess = tf.Session()" inside to "config, ..., sess=tf.Session()". The files involving "tf.Session()" are "core/ensemble.py", "core/estimator.py", and "subnetwork/generator.py".
I put codes as follows at the beginning of each file, like:
from __future__ import ...
import ...

# the first method
GPU_OPTIONS = tf.GPUOptions(allow_growth=True)
CONFIG = tf.ConfigProto(gpu_options=GPU_OPTIONS)
# the second method
# config = tf.ConfigProto()
# config.gpu_options.allow_growth = True

def ....
class ...

    with tf.Session(config=CONFIG) as sess:
        # codes

For your convenience, after modifying those "sess = tf.Session(config=config)", this issue could be reproduced by using examples, which could refer to A Simple Example using AdaNet. Please note that the "MyEstimator, MyEvaluator" should be imported from the codes that you just modified, instead of
from adanet import Estimator
from adanet import Evaluator

. Please modify some of them as follows:
# Please import MyEstimator, MyEvaluator from the codes you just modified
# It may differ from the following three lines that I wrote
from core_estimator import Estimator as MyEstimator  # I did some modifications based on AdaNet
from core_evaluator import Evaluator as MyEvaluator   # I did some modifications based on AdaNet
import examples_simple_dnn as mine_simple_dnn     # I did some modifications based on AdaNet
...
ADANET_ITERATIONS = 7  ##@param {type: "integer"}
max_iteration_steps = TRAIN_STEPS // ADANET_ITERATIONS

estimator = MyEstimator(
            head=head,
            subnetwork_generator=my_simple_dnn.Generator(
                feature_columns=feature_columns,
                optimizer=tf.train.RMSPropOptimizer(learning_rate=LEARNING_RATE),
                seed=RANDOM_SEED),
            max_iteration_steps=temp_stp,
            evaluator=MyEvaluator(input_fn=eval_input_fn, steps=None),
            config=make_config(this_experiment))

Besides, I'm using a TITAN RTX on Ubuntu 18.04 and a GTX 1080 Ti on Ubuntu 16.04. Other details could refer to the beginning of this issue. Therefore, I don't think "TITAN RTX / GTX 1080 Ti / Titan-V GPU" is the problem.
Thanks for helping me.

It's strange,  I found that only the "allow_growth" option doesn't work, others work well.
If I add use this config in my code:
tf_config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True)) tf_config.gpu_options.allow_growth = True tf_config.gpu_options.per_process_gpu_memory_fraction = 0.05
The program will only use 5% gpu memory, and report this message:
Allocator (GPU_0_bfc) ran out of memory trying to allocate 1.04GiB with freed_by_count=0. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory were available.
And the program couldn't run if I allocate less memory.
So the program can't automatic allocate memory as the option "allow_growth" doesn't work.

I'm not familiar with adanet, but as another quick test, can you try running these
import tensorflow as tf
GPU_OPTIONS = tf.GPUOptions(allow_growth=True)
CONFIG = tf.ConfigProto(gpu_options=GPU_OPTIONS)
sess = tf.Session(config = CONFIG)
# <-- sleep and measure the mem usage here

before importing anything from adanet?

I'm not familiar with adanet, but as another quick test, can you try running these
import tensorflow as tf
GPU_OPTIONS = tf.GPUOptions(allow_growth=True)
CONFIG = tf.ConfigProto(gpu_options=GPU_OPTIONS)
sess = tf.Session(config = CONFIG)
# <-- sleep and measure the mem usage here

before importing anything from adanet?

I already did that. Please refer to my previous comments

Well, it seems like this issue goes away even though I'm not sure whether that I'm guessing is the right reason.
Previously, in the middle of models, I initialize some variables manually instead of using tf.global_variables_initializer.
Now, I only initialize those variables that are not initialized at the very time, and suddenly, it works, now the model wouldn't take the whole GPU memory, at least it works for now.

Glad to know that it worked.Closing the issue since its resolved. Thanks!

I had the same code and had debugged for hours but still it did not work -- it just used all the GPU memory it had.
In the end, setting GPU before loading Keras solved my problem of limiting GPU memory usage!
https://github.com/keras-team/keras/issues/1538#issuecomment-342034737


I want to keep my vehicle at 100m fom gound and then spawn on that height. when i start simulation i drops form that height and then runs on ground.

hero_vehicle.set_enable_gravity(False)

https://carla.readthedocs.io/en/0.9.15/python_api/#setters


hot-reload: macOS also uses Ctrl+R

Using .NET 6 on macOS, we can see that dotnet watch uses Ctrl+R, not Cmd+R:
$ dotnet watch
watch : Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload. Press "Ctrl + R" to restart.

@sandyarmstrong ... Did you verify this? That's a generic message written by Windows-based devs on the product unit.

Yes, the output I pasted above was from .net 6 on macos.

And to be clear, I also verified that I have to press Ctrl+r on Mac to restart the app.

Ok, thanks.


[BUG] Docker-Compose Port Not Working

When I try to start the container with a port that is different from 8080, it doesn't work. It seems like the server is not working.
How can I do?

Hi,
Can you give me an example of what you are trying to do?


Translation update for 'react-aria/dnd' and 'react-spectrum/picker'

Translation update for react-aria/dnd

Translation fix for react-spectrum/picker, for Spanish (WAB-27833)

GET_BUILD


Replace gcc in the launcher file generation

Currently launcher files are generating using the (g)c(c) pre-processor. This is heavy-handed since the only actual operation done during this generation is the concatenation of two files. This should be changed to a simple python-based solution that gets called automatically by setup.py.

Fixed by #36


Insertion Sort[Dart]

This issue is about [Algo/DS Name](link to resource for the Algo/DS).

[x] Issue Title is in form Algo/DS Name [Language].
[x] I searched or browsed the repo’s other issues to ensure this is not a duplicate.
[x] This Algo/DS is worth adding to this repository.
[x] Assign this issue to me (I want to work on this).

[x] I ensure that I am not already assigned to 2 or more issues.

[x] I will send my PR only after I'm assigned to this issue by any maintainer.
[x] I understand that I will be unassigned from this issue if I fail to send a PR for this within a week.

Can you please assign this to me? I will solve this issue for you


Integrate enable/disable into FormState and FormField

Use case
I suggest to integrate enable() and disable() into FormState ( setEnable(bool) would do the same thing). Invoking enable() at FormState should invoke enable() in all registered FormFields. Same with disable(). This would just extend the already existing functionality for validate(), reset() and save().
Also supply isEnabled() to check current form state.
See #45604 "Remove attribute readOnly in TextField"
Reason
This would ease data manipulation handling and provide a clean way for all type of inputs.

Flutter uses a functional style rather than an imperative style, generally speaking. I'm not sure this proposal really matches the design of the rest of the framework. I would recommend filing a new issue that describes the use case more clearly rather than suggesting the solution.


Leverage kotlin properties and become independant of the android framework

This stuff should really encourage you to become independant of the android framework and be trivially ready for testing without any mocking non-sense
interface UserSettings {
    var notificationsEnabled: Boolean
    var loginCount: Int
    var nickname: String

    companion object
}

fun UserSettings.Companion.fromSharedPreferences(context: Context): UserSettings {
    return object : UserSettings, SimpleKrate(context) {
        override var notificationsEnabled by booleanPref("notifications_enabled", false)
        override var loginCount by intPref("login_count", 0)
        override var nickname by stringPref("nickname", "")
    }
}

data class TestUserSettings(
        override var notificationsEnabled: Boolean = false,
        override var loginCount: Int = 0,
        override var nickname: String = ""
) : UserSettings

Usage:
// application code
val settings = UserSettings.fromSharedPreferences(context)
settings.loginCount = 10
Log.d("LOGIN_COUNT", "Count: ${settings.loginCount}")

// testing code
val settings = TestUserSettings()
settings.loginCount = 10
Log.d("LOGIN_COUNT", "Count: ${settings.loginCount}")

This seems like a valid usage of the library, have you run into an issue while doing this?


chore: Standardize CI with other projects

@gab-arrobo , the onf-bot does not seem to notify you for this project.

@gab-arrobo , the onf-bot does not seem to notify you for this project.

Thanks for letting me know. You are correct, I did not get any notification

Hi @ghislainbourgeois, FYI, I just opened 3 PRs in AMF, UDM, AUSF to use the util repo instead of this repo. I still need to open one PR in the gnbsim repo to fully remove the dependency from this repo.

@ghislainbourgeois, BTW, it would be great if you can help opening some PRs to replace some of the repos I indicated in the TST notes and use the util repo instead.

@gab-arrobo I started creating some PRs also relating to other deps. Feel free to close those PRs when your other PRs are merged.