CTest integration not picking up test names on first compile

Brief Issue Summary
I have a project where I am managing tests through Catch2.  The CTest integration can successfully find, run, and display the results from my tests, but I'm facing an odd issue where it only works on the second compile of the project.
The first compile and run of Ctest finds no tests because instead of running the tests with a command of the form:
ctest -jxx -C Debug -T test --output-on-failure -R ^my_test_name-buildid
it instead runs
ctest -jxx -C Debug -T test --output-on-failure -R ^my_test_name_NOT_BUILT-buildid
The build itself actually looks fine, running ctest with no arguments in the build directory will run all the tests.
What's odd is that if I recompile (say by selecting a different build variant) and recompile/retest, changing nothing else, it will correctly pick up and run all the tests.
I can't figure out where the extension is picking up the test names, for example grepping for NOT_BUILT in the build directory returns nothing.
CMake Tools Diagnostics
No response
Debug Log
No response
Additional Information
No response

Thanks for the report! I suspect the NOT_BUILT suffix is coming from Catch2, although I'm not familiar enough with Catch2 to understand why it does this. We will attempt to reproduce the issue to see if there's a way the CMake Tools extension can better handle this case and let you know if we need any more information.

Thanks.  Things do seem to work fine with the C++ TestMate extension, which is probably better integrated with Catch.  It would be nice to be able to run the test properly from cmake-tools directly, but it's not a high priority if it doesn't happen.

I'm hitting the same issue but with GTest, but for me rebuilding is not helping. The fix for me is to refresh the tests (either through UI or with command cmake.refreshTests).
@benmcmorran, I have a similar file (<test_name>[1]_include.cmake) being generated in the build folder. Note that with GTest the suffix is slightly different.
if(EXISTS "<path>/<test_name>[1]_tests.cmake")
  include("<path>/<test_name>[1]_tests.cmake")
else()
  add_test(<test_name>_NOT_BUILT <test_name>_NOT_BUILT)
endif()

The file <path>/<test_name>[1]_tests.cmake does exist, and refresh is making the vscode integration pick it up.
A solid repro for me is to delete the build folder (so starting fresh) and clicking run all tests in the UI.
So, I guess the fix is to run test refresh after the build finishes and prior to running the tests (but automatically).

I'm hitting the same issue but with GTest, but for me rebuilding is not helping. The fix for me is to refresh the tests (either through UI or with command cmake.refreshTests).

I spent quite a bit of time debugging this today. From what I can tell it looks like VSCode is querying and caching the tests before the initial build is complete. As such the corresponding _tests.cmake file is not in the build tree and the test gets stubbed out with a _NOT_BUILT test.
So I agree that it would make sense to refresh the tests any time that build is run that touches a test target.

@dcoles Thank you for the follow up. Our developers will be working on this issue, thank you for your patience.

We are having the _NOT_BUILT problem with GTest (on first compile or recompile) and have discovered that disabling "test explorer integration" in the CMake plugin eliminates the problem.  When test explorer integration is enabled, it changes the way ctest is invoked; instead of letting ctest discover the tests the way it normally would, instead ctest is invoked on each test executable once  for each test (incorrectly?) discovered by test explorer integration, with a regex filter designed to select just that test.  But something is wrong with those invocations; I'm not sure what.  You can reproduce this problem with this project

@dabrahams Thank you very much for being able to ask this question, when I use this project you provided to reproduce the problem it will fail to configure, I can't be sure if this is something wrong with my operation, can you provide a simple reproduction project or a recording of the problem reproduced?

You need to add a minimal CMakePresets.json in the root, IIRC.  I let the plugin generate one for me; it allowed me to reproduce:
{
  "version": 8,
  "configurePresets": [
    {
      "name": "vscode",
      "displayName": "Custom configure preset",
      "description": "Sets Ninja generator, build and install directory",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/out/build/${presetName}",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
      }
    }
  ]
}

I just pushed an update to make it easier to reproduce.
Run CTest using the test-debug preset to see the error:

The result will contain failures like this on some of the tests:
[proc] Executing command: /usr/local/bin/ctest -C Debug --output-on-failure -R ^verbose_configuration_tests_NOT_BUILT$
[ctest] Test project /Users/sean-parent/repos/github.com/stlab/adobe-contract-checks/out/build/test-debug
[ctest] No tests were found!!!

The test explorer gets wedged -

My current list of extensions (not all are enabled, but there is no filter to list only enabled ones).
code --install-extension andruhovski.html-md-converter
code --install-extension antfu.slidev
code --install-extension bierner.github-markdown-preview
code --install-extension bierner.markdown-checkbox
code --install-extension bierner.markdown-emoji
code --install-extension bierner.markdown-footnotes
code --install-extension bierner.markdown-mermaid
code --install-extension bierner.markdown-preview-github-styles
code --install-extension bierner.markdown-yaml-preamble
code --install-extension cs128.cs128-clang-tidy
code --install-extension cschlosser.doxdocgen
code --install-extension dafny-lang.ide-vscode
code --install-extension davidanson.vscode-markdownlint
code --install-extension dbaeumer.vscode-eslint
code --install-extension eamodio.gitlens
code --install-extension editorconfig.editorconfig
code --install-extension esbenp.prettier-vscode
code --install-extension fredericbonnet.cmake-test-adapter
code --install-extension github.copilot
code --install-extension github.copilot-chat
code --install-extension github.vscode-github-actions
code --install-extension github.vscode-pull-request-github
code --install-extension gitworktrees.git-worktrees
code --install-extension hbenl.vscode-test-explorer
code --install-extension ivanhofer.git-assistant
code --install-extension jeff-hykin.better-cpp-syntax
code --install-extension kruemelkatze.vscode-dashboard
code --install-extension moshfeu.compare-folders
code --install-extension ms-azuretools.vscode-docker
code --install-extension ms-python.debugpy
code --install-extension ms-python.isort
code --install-extension ms-python.python
code --install-extension ms-python.vscode-pylance
code --install-extension ms-toolsai.jupyter
code --install-extension ms-toolsai.jupyter-keymap
code --install-extension ms-toolsai.jupyter-renderers
code --install-extension ms-toolsai.vscode-jupyter-cell-tags
code --install-extension ms-toolsai.vscode-jupyter-slideshow
code --install-extension ms-vscode-remote.remote-containers
code --install-extension ms-vscode-remote.remote-ssh
code --install-extension ms-vscode-remote.remote-ssh-edit
code --install-extension ms-vscode-remote.remote-wsl
code --install-extension ms-vscode-remote.vscode-remote-extensionpack
code --install-extension ms-vscode.cmake-tools
code --install-extension ms-vscode.cpptools
code --install-extension ms-vscode.cpptools-extension-pack
code --install-extension ms-vscode.cpptools-themes
code --install-extension ms-vscode.powershell
code --install-extension ms-vscode.remote-explorer
code --install-extension ms-vscode.remote-server
code --install-extension ms-vscode.test-adapter-converter
code --install-extension ms-vscode.vscode-speech
code --install-extension ms-vsliveshare.vsliveshare
code --install-extension ms-vsliveshare.vsliveshare-pack
code --install-extension mushan.vscode-paste-image
code --install-extension parallelsdesktop.parallels-desktop
code --install-extension pdconsec.vscode-print
code --install-extension raymondcamden.languagetool
code --install-extension redhat.java
code --install-extension rust-lang.rust-analyzer
code --install-extension ryu1kn.edit-with-shell
code --install-extension stkb.rewrap
code --install-extension streetsidesoftware.code-spell-checker
code --install-extension tomoki1207.pdf
code --install-extension twxs.cmake
code --install-extension tyriar.vscode-terminal-here
code --install-extension vadimcn.vscode-lldb
code --install-extension visualstudioexptteam.intellicode-api-usage-examples
code --install-extension visualstudioexptteam.vscodeintellicode
code --install-extension vscjava.vscode-gradle
code --install-extension vscjava.vscode-java-debug
code --install-extension vscjava.vscode-java-dependency
code --install-extension vscjava.vscode-java-pack
code --install-extension vscjava.vscode-java-test
code --install-extension vscjava.vscode-maven
code --install-extension xaver.clang-format
code --install-extension znck.grammarly

I have reproduced it with a much shorter list of extensions attached

@dabrahams Thank you very much for your reply as well as the update, we are having the following problem with the project you provided, on the first Run tests all the tests give an error, on every subsequent click a different test gives an error. Does this reproduce the problem you mentioned?
Actual result:
First click:

Second click:

Third click:

I don't understand what this means:

Does this reproduce the problem you mentioned?

You're talking about a different set of steps.  Whether it's the same problem is unclear.  Are you asking whether I see the same symptoms if I follow those steps?
Please clarify, thanks.
@sean-parent maybe you can answer?

@dabrahams  I'm very sorry that I didn't understand your question, I thought your question was the same as the one mentioned in this issue.

@dabrahams  I'm very sorry that I didn't understand your question, I thought your question was the same as the one mentioned in this issue.

Now I'm even more confused. What question? Before this reply saying I didn't understand your question to me, I had no question. What I had was a reproducible example that shows some of the same symptoms as the OP, a workaround, and a partial explanation for why the workaround is effective. I assumed that information might be helpful to you in fully diagnosing and then fixing the problem.
Please let me know if there's anything further I can do to make this information more useful. If you think it's unrelated maybe it would help for me to file a separate issue?

@dabrahams  I'm very sorry that I didn't understand your question, I thought your question was the same as the one mentioned in this issue.

Now I'm even more confused. What question? Before this reply saying I didn't understand your question to me, I had no question. What I had was a reproducible example that shows some of the same symptoms as the OP, a workaround, and a partial explanation for why the workaround is effective. I assumed that information might be helpful to you in fully diagnosing and then fixing the problem.
Please let me know if there's anything further I can do to make this information more useful. If you think it's unrelated maybe it would help for me to file a separate issue?

@dabrahams To be clear, it sounds this like this problem is well understood now.
It sounds like, when the test explorer integration is enabled, it works as expected, but when it isn't enabled, it doesn't behave as expected in this scenario.
@v-frankwang I don't believe this needs any further triaging, @dabrahams please confirm and I will label this accordingly and put it in our backlog.

It sounds like, when the test explorer integration is enabled, it works as expected, but when it isn't enabled, it doesn't behave as expected in this scenario.

No, it's exactly the opposite.

@dabrahams Ah, thanks for the clarification, my apologies. I'll update the context.


v0.10.5 release

We had several regressions in v0.10.4, so I'd like to issue a v0.10.5 release shortly with some fixes.
I also had a couple of highly productive plane rides to/from vacation, so I found time to put together a number of bug-fix PRs. If anyone has time to help review these, it would be greatly appreciated!
Issues to resolve:

How should Dataset.update() handle conflicting coordinates? #2180 (resolved for now)

PRs for regressions in v0.10.4:

[x] Fix writing to groups with h5netcdf #2181
[x] Fix DataArray.stack() with non-unique coordinates on pandas 0.23 #2168
[ ] Fix dtype=S1 encoding in to_netcdf() #2158

PRs for older bugs:

[x] Fix DataArray.groupby().reduce() mutating input array #2169
[x] Bug fixes for Dataset.reduce() and n-dimensional cumsum/cumprod #2156
[x] Validate output dimension sizes with apply_ufunc #2155
[x] Fix string slice indexing for a length-1 CFTimeIndex #2166
[x] Fix unlimited dims bug #2154

cc @pydata/xarray @crusaderky

OK, that took a little longer than I thought!
I plan to merge https://github.com/pydata/xarray/pull/2158/ and issue the 0.10.5 end of day today unless anyone has objections.

I tagged v0.10.5 and uploaded it to pypi before noticing that due to a bug in our versioneer setup, our version number was v0.10.5 instead of the correct 0.10.5. Oops!
Pypi doesn't allow overwriting files, so I just tagged and uploaded v0.10.6 as well.
Hopefully this version builds properly on conda-forge: https://github.com/conda-forge/xarray-feedstock/pull/33


Update API documentation to mention pagination

What does this PR do?
This PR updates API documentation to mention pagination, and how to control the pagination.
Motivation
I had a Traefik deployment that had over 100 HTTP routers, and was perplexed as to why some were missing in my API queries. I eventually came across #6917 , and thought documentation updates would be helpful to others.
More

[ ] Added/updated tests
[X] Added/updated documentation

Additional Notes
I built the documentation locally according to Method 1, and looked at it on my local workstation to see if my change looked ok. I then used make docs to clean and verify the docs.
...
=== Checking HTML content...
= Documentation checked successfully.

Thanks all! Happy to contribute to Traefik!


Invalid check for FormConfigBuilderInterface::addEventListener

If one adds an event via closure for the POST_SUBMIT event psalm will incorrectly mark it as an error, expecting a callable with PreSetDataEvent/PostSetDataEvent/SubmitEvent
But there's also PostSubmitEvent (at least in 4.4+), which should be added to the list.

@seferov Want me to take a look at that?

@zmitic yes, please. Thank you

@seferov Done, but some tests are failing not related to this issue.


[Feature/Workaround] Triad Grip minion conversions working in PoB for Zombie Slam

Please note that by no means this is official.
This is nothing but a placeholder if we're ever to get the mods to be coded correctly.
Since I could not figure out how to code a new, working modifier that would actually convert the physical damage into various elements + chaos, I've made some changes to the following files:

Gems.lua
act_int.lua
Minions.lua
minion.lua

tl;dr: I have added a separate gem (Raised Zombie Triad Grip) that can calculate conversions that you would normally receive from the Triad Grip gloves. For the time being, it is only working for Slam attack, as I have yet to locate:
skillList = {
Melee",
The whole set up I have made in particular is based around 4-linked white sockets (100% chaos conversion). All you will need to do is edit the conversion tags if you would like to receive different effects. Tested - works.
different tags for different conversions:
"skill_physical_damage_%to_convert_to_fire",
"skill_physical_damage%to_convert_to_cold",
"skill_physical_damage%_to_convert_to_lightning",
There is a specific call to the nodes below in:
},
levels = {
depending on your placement of the conversion tag in stats = {, enter it in the specific % you want to convert in levels = {
Example: gloves with 2 white and 2 blue sockets:
stats = {
"skill_physical_damage_%_to_convert_to_chaos",
"skill_physical_damage_%_to_convert_to_lightning",
"active_skill_attack_speed_+%final",
"active_skill_damage+%_final",
"base_skill_effect_duration",
"is_area_damage",
"global_always_hit",
levels = {
[1] = { 50, 50, -22, 45, 0, cooldown = 4, levelRequirement = 1, statInterpolation = { 1, 1, 1, 1, }, },
You can edit files yourself if you have downloaded the dev repository. Remember to keep the correct coding (take original skills for reference), or otherwise the dev client will crash on you instantly. I don't know if I am allowed to upload files here, so I will refrain myself from doing so.
Add the following lines of code to the listed files below to get a working 4W Triad Grip:
Gems.lua:
["Metadata/Items/Gems/SkillGemRaiseZombie2"] = {
name = "Raise Zombie Triad Grip",
grantedEffectId = "RaiseZombie2",
tags = {
intelligence = true,
active_skill = true,
physical = true,
attack = true,
melee = true,
chaos = true,
},
tagString = "Spell, Minion, Physical, Chaos",
reqStr = 0,
reqDex = 0,
reqInt = 100,
},
act_int.lua:
skills["RaiseZombie2"] = {
name = "Raise Zombie Triad Grip",
color = 3,
description = "Modified Raise Zombie Gem to reflect Triad Grip conversions",
skillTypes = { [SkillType.Spell] = true, [SkillType.SkillCanTrap] = true, [SkillType.SkillCanTotem] = true, [SkillType.SkillCanMine] = true, [SkillType.SpellCanRepeat] = true, [SkillType.Triggerable] = true, [SkillType.CanRapidFire] = true, [SkillType.CreatesMinion] = true, },
minionSkillTypes = { [SkillType.Attack] = true, [SkillType.Melee] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.AttackCanRepeat] = true, [SkillType.Area] = true, [SkillType.ChaosSkill] = true, },
statDescriptionScope = "minion_spell_skill_stat_descriptions",
castTime = 0.85,
minionList = {
"RaisedZombie2",
},
statMap = {
["zombie_slam_cooldown_speed_+%"] = {
mod("MinionModifier", "LIST", { mod = mod("CooldownRecovery", "INC", nil, 0, 0, { type = "SkillId", skillId = "ZombieSlam" }) }),
},
},
baseFlags = {
spell = true,
attack = true,
chaos = true,
},
baseMods = {
},
qualityStats = {
{ "minion_maximum_life_+%", 1 },
{ "minion_movement_speed_+%", 1 },
},
stats = {
"base_number_of_zombies_allowed",
"active_skill_minion_damage_+%final",
"display_minion_monster_type",
"display_minion_monster_level",
"zombie_slam_cooldown_speed+%",
"active_skill_minion_life_+%final",
"base_physical_damage%_to_convert_to_chaos",
},
levels = {
[1] = { 3, 0, 1, 1, 0, 0, 100, 100, manaCost = 10, levelRequirement = 1, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[2] = { 3, 0, 1, 2, 4, 2, 100, 100, manaCost = 11, levelRequirement = 2, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[3] = { 3, 0, 1, 4, 8, 4, 100, 100, manaCost = 12, levelRequirement = 4, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[4] = { 3, 0, 1, 7, 12, 6, 100, 100, manaCost = 13, levelRequirement = 7, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[5] = { 4, 0, 1, 11, 16, 8, 100, 100, manaCost = 14, levelRequirement = 11, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[6] = { 4, 0, 1, 16, 20, 10, 100, 100, manaCost = 16, levelRequirement = 16, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[7] = { 4, 0, 1, 20, 24, 12, 100, 100, manaCost = 18, levelRequirement = 20, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[8] = { 4, 0, 1, 24, 28, 14, 100, 100, manaCost = 21, levelRequirement = 24, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[9] = { 4, 0, 1, 28, 32, 16, 100, 100, manaCost = 24, levelRequirement = 28, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[10] = { 5, 0, 1, 32, 36, 18, 100, 100, manaCost = 26, levelRequirement = 32, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[11] = { 5, 0, 1, 36, 40, 20, 100, 100, manaCost = 28, levelRequirement = 36, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[12] = { 5, 0, 1, 40, 44, 22, 100, 100, manaCost = 30, levelRequirement = 40, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[13] = { 5, 0, 1, 44, 48, 24, 100, 100, manaCost = 31, levelRequirement = 44, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[14] = { 5, 0, 1, 48, 52, 26, 100, 100, manaCost = 32, levelRequirement = 48, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[15] = { 6, 0, 1, 52, 56, 28, 100, 100, manaCost = 33, levelRequirement = 52, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[16] = { 6, 0, 1, 56, 60, 30, 100, 100, manaCost = 34, levelRequirement = 56, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[17] = { 6, 0, 1, 60, 64, 32, 100, 100, manaCost = 35, levelRequirement = 60, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[18] = { 6, 0, 1, 64, 68, 34, 100, 100, manaCost = 36, levelRequirement = 64, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[19] = { 6, 0, 1, 67, 72, 36, 100, 100, manaCost = 37, levelRequirement = 67, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[20] = { 7, 0, 1, 70, 76, 38, 100, 100, manaCost = 38, levelRequirement = 70, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[21] = { 7, 0, 1, 72, 80, 40, 100, 100, manaCost = 38, levelRequirement = 72, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[22] = { 7, 0, 1, 74, 84, 42, 100, 100, manaCost = 38, levelRequirement = 74, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[23] = { 7, 0, 1, 76, 88, 44, 100, 100, manaCost = 38, levelRequirement = 76, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[24] = { 7, 0, 1, 78, 92, 46, 100, 100, manaCost = 39, levelRequirement = 78, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[25] = { 8, 0, 1, 80, 96, 48, 100, 100, manaCost = 40, levelRequirement = 80, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[26] = { 8, 0, 1, 82, 100, 50, 100, 100, manaCost = 40, levelRequirement = 82, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[27] = { 8, 0, 1, 84, 104, 52, 100, 100, manaCost = 41, levelRequirement = 84, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[28] = { 8, 0, 1, 86, 108, 54, 100, 100, manaCost = 42, levelRequirement = 86, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[29] = { 8, 0, 1, 88, 112, 56, 100, 100, manaCost = 42, levelRequirement = 88, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[30] = { 9, 0, 1, 90, 116, 58, 100, 100, manaCost = 42, levelRequirement = 90, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[31] = { 9, 0, 1, 91, 118, 59, 100, 100, manaCost = 43, levelRequirement = 91, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[32] = { 9, 0, 1, 92, 120, 60, 100, 100, manaCost = 43, levelRequirement = 92, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[33] = { 9, 0, 1, 93, 122, 61, 100, 100, manaCost = 44, levelRequirement = 93, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[34] = { 9, 0, 1, 94, 124, 62, 100, 100, manaCost = 44, levelRequirement = 94, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[35] = { 10, 0, 1, 95, 126, 63, 100, 100, manaCost = 44, levelRequirement = 95, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[36] = { 10, 0, 1, 96, 128, 64, 100, 100, manaCost = 44, levelRequirement = 96, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[37] = { 10, 0, 1, 97, 130, 65, 100, 100, manaCost = 44, levelRequirement = 97, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[38] = { 10, 0, 1, 98, 132, 66, 100, 100, manaCost = 44, levelRequirement = 98, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[39] = { 10, 0, 1, 99, 134, 67, 100, 100, manaCost = 44, levelRequirement = 99, statInterpolation = { 1, 1, 1, 1, 1, 1, 1, 1, }, },
[40] = { 11, 0, 1, 100, 136, 68, 100, 100, manaCost = 44, levelRequirement = 100, statInterpolation = { 1, 1, 1, 1, 1, 1, 1 }, },
},
}
Minions.lua:
minions["RaisedZombie2"] = {
name = "Raised Zombie",
life = 3.75,
armour = 0.7,
fireResist = 40,
coldResist = 40,
lightningResist = 40,
chaosResist = 20,
damage = 2.19,
damageSpread = 0.4,
attackTime = 1.17,
attackRange = 11,
accuracy = 3.4,
limit = "ActiveZombieLimit",
skillList = {
"Melee",
"ZombieSlam2",
},
modList = {
mod("Armour", "INC", 40), -- MonsterImplicitDamageReduction1 [physical_damage_reduction_rating_+% = 40]
-- RaiseZombieStunThreshold [stun_threshold_+% = 30]
},
}
minion.lua:
skills["ZombieSlam2"] = {
name = "Slam",
hidden = true,
color = 4,
skillTypes = { [SkillType.PhysicalSkill] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.Attack] = true, },
statDescriptionScope = "skill_stat_descriptions",
castTime = 1,
baseFlags = {
physical = true,
melee = true,
area = true,
attack = true,
},
baseMods = {
skill("radius", 18),
},
qualityStats = {
},
stats = {
"skill_physical_damage_%to_convert_to_chaos",
"active_skill_attack_speed+%final",
"active_skill_damage+%_final",
"base_skill_effect_duration",
"is_area_damage",
"global_always_hit",
},
levels = {
	[1] = { 100, -22, 45, 0, cooldown = 4, levelRequirement = 1, statInterpolation = { 1, 1, 1, 1, }, },
},

}

As mentioned above, I will look into making a second "Melee" attack that would also convert the damage for Zombie's default attack.


TRAVIS CI failing for java 11 checks

I get the following message when I try running the CI pipeline . It looks like for some reason that the install of the jdk seems to fail.
Here is the snippet of result I see for this PR

Setting APT mirror in /etc/apt/sources.list: http://us-central1.gce.archive.ubuntu.com/ubuntu/
$ export JAVA_HOME=${TRAVIS_HOME}/oraclejdk11
$ bash install-jdk.sh -F 11 -L BCL --target $JAVA_HOME --workspace ${TRAVIS_HOME}/.cache/install-jdk
install-jdk.sh 2018-08-16
Couldn't determine a download url for 11-BCL on linux-x64
The command "bash install-jdk.sh -F 11 -L BCL --target $JAVA_HOME --workspace ${TRAVIS_HOME}/.cache/install-jdk" failed and exited with 1 during .

looking.

I restarted the oracle JDK11 build for #1237  and it looks like it's proceeding. Maybe just a transient failure?

Yeah . It works for me now


Crossing way-waterway not warning shown in ID

Dont know if reported already, but in any crossing way-waterway there is NO Warning from the system if they share a connection node with any attribute, if there is NO node shared between the way-waterway crossing, them the system raise a warning in Issues and suggest correction.
The connecting node should be a Ford, or be added a Tunnel or a Bridge for this crossing (way-waterway)..

Yep, this is #7418.


Fix release race condition

Description
This PR fixes a race condition in the release process. If we merge the release notes into main before the release branch, then the "Publish GitHub release" step will fail. This PR should fix that by:

adding a trigger to start the release (create the tags) on pushes to versions.yaml on release/* branches.
checking if the release branch exists, and if it does and the workflow is running on a push to main, then stop the workflow. This defers the tag creation to the release branch (which happens after we cherry pick and merge the release notes into the release branch).

Type of change

This pull request fixes a bug in Radius and has an approved issue (issue link required).

Fixes: #6874

needs rebase, functional test runs before merge


BAU: local dev experience improvements

Once a consensus is reached, the README.md will be updated to reflect sensible defaults and guidance for local development.

add simple start file that won't try to manage threads or add overhead
scripts to connect to different environments running locally

tunnel: any AWS environment that the developer has tunneled into
local: microservices running locally, usually managed by Docker
docker: this expects the service to running inside of Docker and is
connecting to a network in Docker compose

Optimisations

only include google analytics if we're in a production environment;
there's no need to include empty values locally

These look like they've been incorporated in subsequent changes


rds_global_cluster endpoint in connection details

Description of your changes
This is to ensure global cluster endpoints are exported to connection secrets.

Fixes #
I have:

[ ] Read and followed Crossplane's contribution process.
[ ] Run make reviewable to ensure this PR is ready for review.
[ ] Added backport release-x.y labels to auto-backport this PR if necessary.

How has this code been tested
A local build was deployed to a cluster, an RDS GlobalDatabase was created, and the secret was inspected. The endpoint value was there as expected.

Continuous of this: https://github.com/crossplane-contrib/provider-upjet-aws/pull/1583


Token error with Sagemaker Async Operators

Describe the bug
Getting errors with the new Sagemaker Async Operators that I don't get with the traditional ones. I'm using a personal Access Key, Secret, and Session Token as I did with the non async operators for auth.
botocore.exceptions.ClientError: An error occurred (UnrecognizedClientException) when calling the DescribeTrainingJob operation: The security token included in the request is invalid.

To Reproduce
Steps to reproduce the behavior:
Use the SageMaker async operators with user Access Key, Secret, and Session Token
Expected behavior
Expect it to not have auth/token errors.
Additional context
When I switch back to the traditional operators in the same dag with the same auth creds it works fine.
@kentdanas also had similar issues and her auth was setup a little different.

The issue is with the session token is not considered while the secrete and access key is given in the connection proper field, not in the extra config


Git clone Permission denied

I am receiving a Permission denied when attempting to clone the repository for this example with the following command: git clone git@github.com:oktadeveloper/okta-aspnetcore-mvc-example.git

Nevermind, used the clone button up top and worked.


Fix offline token command flags not working

Summary
The following PR fixes the offline token command where the flags were not actually working so far.
Fixes #3875
Change Type
Mark the type of change your PR introduces:

[x] Bug fix (resolves an issue without affecting existing features)
[ ] Feature (adds new functionality without breaking changes)
[ ] Breaking change (may impact existing functionalities or require documentation updates)
[ ] Documentation (updates or additions to documentation)
[ ] Refactoring or test improvements (no bug fixes or new functionality)

Testing
Outline how the changes were tested, including steps to reproduce and any relevant configurations.
Attach screenshots if helpful.
Review Checklist:

[x] Reviewed my own code for quality and clarity.
[ ] Added comments to complex or tricky code sections.
[ ] Updated any affected documentation.
[ ] Included tests that validate the fix or feature.
[ ] Checked that related changes are merged.

coverage: 53.048%. remained the same
when pulling 366ec488d01b2784aac0c53f61da09c74064c4b2 on fix-offline
into 41e48333e3c329cc02a6eb688bf0192dcbd77493 on main.


Accessibility issues with tabbing and focus

Great package, but we found a few accessibility issues that should likely be addressed in the package rather than on our end.

No default focus state for calendar dates. The demo has an outline but that is the default browser outline, there should be an explicit one by default given your controlling tab order & states.
The month/year clickable items in the header are currently spans and cannot be tabbed to. Either convert them to buttons or give them a tabindex.

I'm working on it!

@shahabyazdi - Awesome, glad to hear it.

Fixed in v4.5.0.


Error message not very useful

Just trying out BluePic. When starting locally I get:

./BluePicServer
INFO: init() Configuration.swift line 51 - Using configuration values from 'cloud_config.json'.
ERROR: BluePicServer main.swift line 34 - Oops, something went wrong... Server did not start! Failed with error: The operation couldn’t be completed. (BluePicApp.Configuration.BluePicError error 0.)

which is not very helpful:
diff --git i/BluePic-Server/Sources/BluePicServer/main.swift w/BluePic-Server/Sources/BluePicServer/main.swift
index 1d3affa..0d0e256 100644
--- i/BluePic-Server/Sources/BluePicServer/main.swift
+++ w/BluePic-Server/Sources/BluePicServer/main.swift
@@ -24,13 +24,13 @@ import CloudFoundryDeploymentTracker
 HeliumLogger.use(LoggerMessageType.info)

 do {
   let serverController = try ServerController()
   // Start server...
   Kitura.addHTTPServer(onPort: serverController.port, with: serverController.router)
   Kitura.run()

-} catch let error {
-  Log.error("Oops, something went wrong... Server did not start! Failed with error: \(error.localizedDescription)")
-  exit(1)
+} catch Configuration.BluePicError.IO(let reason) {
+    Log.error("Oops, something went wrong... Server did not start! Failed with error: \(reason)")
+    exit(1)
 }

will fix it and return:

BluePicServer
INFO: init() Configuration.swift line 51 - Using configuration values from 'cloud_config.json'.
ERROR: BluePicServer main.swift line 34 - Oops, something went wrong... Server did not start! Failed with error: Failed to obtain IBM Push credentials.

@nikwest You are correct, it would be much more helpful to print out descriptive errors. We would love to see your proposed fix on this. You could also look into LocalizedErrors, similar to what we do in RouteUtils. To actually accept a pull request, we need you to have completed a CLA form. Thanks

I fixed the issue by replacing "imfpush"s entry in cloud_config.json with the whole "imfpush" you get when you pull up the service credentials for BluePic-IBM-Push in your app's page on Bluemix.
For example, mine is:
"imfpush": [
    {
      "credentials": {
        "appGuid": "1d47e593-dcc3-4d7c-bd64-3669a0ec7255",
        "url": "http://imfpush.ng.bluemix.net/imfpush/v1/apps/1d47e593-dcc3-4d7c-bd64-3669a0ec7255",
        "admin_url": "//mobile.ng.bluemix.net/imfpushdashboard/?appGuid=1d47e593-dcc3-4d7c-bd64-3669a0ec7255",
        "appSecret": "362697d1-9245-4160-a451-5302e484084f",
        "clientSecret": "13cecaff-3a24-491d-94f8-ff440007537f"
      },
      "syslog_drain_url": null,
      "label": "imfpush",
      "provider": null,
      "plan": "Basic",
      "name": "BluePic-IBM-Push",
      "tags": [
        "mobile",
        "ibm_created",
        "ibm_dedicated_public"
      ]
    }
  ]

Hi,
I found the same issue when I am running in my local docker container.
The reason is because in cloud_config file for imfpush configuration. It is missing  appGuid field which is required in Configuration.swift as below.
    guard let appGuid = pushCredentials["appGuid"].string,
      let url = pushCredentials["url"].string,
      let adminUrl = pushCredentials["admin_url"].string,
      let secret = pushCredentials["appSecret"].string else {
        throw BluePicError.IO("Failed to obtain IBM Push credentials.")
    }
    let ibmPushProperties = IbmPushProps(appGuid: appGuid, url: url, adminUrl: adminUrl, secret: secret)

And from the code above, I can see it has already tried to throw a useful message. But it is not shown in the logging. Because in main.swift, the error is in the following format.
IO("Failed to obtain IBM Push credentials.")
`
But the localizedDescription attribution for this error will always show the following message:
The operation couldn’t be complete
d. (BluePicApp.Configuration.BluePicError error 0.)

So I removed localizedDescrtion show the useful message as below:
Log.error("Oops, something went wrong... Server did not start! Failed with error: \(error)")
Now it is showing the correct log as below:
ERROR: BluePicServer main.swift line 35 - Oops, something went wrong... Server did not start! Failed with error: IO("Failed to obtain IBM Push credentials.")
Do you think this is acceptable? If yes, I am willing to submit a pull request.

@YouYue123 Good catch with the cloud_config.json appGuid missing field. We will need to update that file.
As for the error logging issue, that looks like an acceptable fix. Once you have submitted a CLA form, please feel free to submit a pull request for this!

FYI, I went ahead and updated our cloud_config.json in a PR.

Looks like @christiancompton fixed this in the latest PR merge #387


Polymer Dart app does not run on Android (Report from Stack Overflow)

http://stackoverflow.com/questions/27138836/polymer-dart-element-run-on-ubuntu-but-it-doesn-t-in-chrome-app-on-android-dev

We'll close/backlog this issue for now, on the assumption you've found a solution/workaround. Feel free to re-open if assistance is still needed.

I've haven't found any workaround. In the near future I would like to retry. If i'll find a solution i'll report here and on http://stackoverflow.com/questions/27138836/polymer-dart-element-run-on-ubuntu-but-it-doesn-t-in-chrome-app-on-android-dev


"npx shopify hydrogen debug cpu" is not working

What is the location of your example repository?
You can create a new Hydrogen project and it will have this issue
Which package or tool is having this issue?
Hydrogen
What version of that package or tool are you using?
2024.7.4
What version of Remix are you using?
2.10.1
Steps to Reproduce

Create a new Hydrogen project using npm create @shopify/hydrogen@latest.
Try to use npx shopify hydrogen debug cpu

Expected Behavior
CPU profiling to work.
Actual Behavior
I get an error that says SourceMapConsumer is not a constructor.

I did some investigating and it looks like there's a couple issues, the first one seems to be related to CJS compat in the cpu-profiler.ts file where it imports source-map. When the file is actually run SourceMapConsumer is on default from that module. After resolving that there seems to be an issue where Hydrogen is not finishing the build when profiling.

Okay I can reproduce this.

Generate a brand new project
Run npx shopify hydrogen debug cpu


Unpacking .deb File Results In etc/miniflux.conf file not an absolute pathname.

root@newsreader:/# apt install ./miniflux_2.0.22_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'miniflux' instead of './miniflux_2.0.22_amd64.deb'
The following NEW packages will be installed:
  miniflux
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/3,842 kB of archives.
After this operation, 13.0 MB of additional disk space will be used.
Get:1 /miniflux_2.0.22_amd64.deb miniflux amd64 2.0.22 [3,842 kB]
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package miniflux.
(Reading database ... 12038 files and directories currently installed.)
Preparing to unpack /miniflux_2.0.22_amd64.deb ...
dpkg: error processing archive /miniflux_2.0.22_amd64.deb (--unpack):
 conffile name 'etc/miniflux.conf' is not an absolute pathname
Errors were encountered while processing:
 /miniflux_2.0.22_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
root@newsreader:/# cat /etc/debian_version
bullseye/sid
root@newsreader:/# apt policy dpkg
dpkg:
  Installed: 1.20.5
...
root@newsreader:/# apt policy apt
apt:
  Installed: 2.1.7

I'm testing Miniflux in a Linux container (LXC) and dpkg won't proceed unless /etc/miniflux.conf becomes an absolute path name instead of etc/miniflux.conf.
Update as of 6:37 PM EDT:
I found a problem after I do a dpkg-deb -R:
root@newsreader:/miniflux-issue# cat DEBIAN/conffiles
etc/miniflux.conf
/etc/miniflux.conf

The first line is a duplicate of the second line without the leading forward slash.
Update as of 11:43 PM:
Once I change the above conffiles file to this:
root@newsreader:/miniflux-issue# cat DEBIAN/conffiles
/etc/miniflux.conf

...and do a dpkg-deb --build miniflux.deb, the package installs just fine.

It should be fixed by this commit https://github.com/miniflux/deb-package/commit/0f436ea7a14c33043c5abdc5785d4e7a7e0651a5


Delete async on DB2 tables returning error "An DB2Parameter with ParameterName '@totalRowAffected' is not contained by this DB2ParameterCollection."

Hi i am trying to run the following command on my ef 6 edmx context:
cnt.[tbl].Where(c=>c.condition).DeleteAsync(x => { x.Executing = command => commandText = command.CommandText; })
i get the following Error:
An DB2Parameter with ParameterName '@totalRowAffected' is not contained by this DB2ParameterCollection.
Here is the commandText:
DECLARE @rowAffected INT
DECLARE @totalRowAffected INT
SET @totalRowAffected = 0
WHILE @rowAffected IS NULL
OR @rowAffected > 0
BEGIN
DELETE TOP (4000)
FROM    A
FROM    [table] AS A
INNER JOIN ( SELECT
FROM [table]
WHERE [condition] ) AS B ON [join condition]
AND [condition]
    SET @rowAffected = @@ROWCOUNT
    SET @totalRowAffected = @totalRowAffected + @rowAffected
END

SELECT  @totalRowAffected
IBM specified the error as two parameters having the same name but i only see 2 parameters at the top declared and they are different names?

Hello @MIKEPArA ,
Our library is not yet compatible with DB2.
We might add the support later but we currently have no short-term plan until our new library : http://entityframework-classic.net/ become more mature
Best Regards,
Jonathan

Hi, thanks Jonathan.

I added a task to our "wish-list"
Since that's something we will do in short-term plan, I will close this issue.


add ci cargo audit

I just realised we are still using some outdated dependencies which happen to have rustsec warnings:
cargo audit                                                                                13:45:15
    Fetching advisory database from `https://github.com/RustSec/advisory-db.git`
      Loaded 374 security advisories (from /Users/stephan/.cargo/advisory-db)
    Updating crates.io index
    Scanning Cargo.lock for vulnerabilities (118 crate dependencies)
Crate:         openssl-src
Version:       111.15.0+1.1.1k
Title:         SM2 Decryption Buffer Overflow
Date:          2021-08-24
ID:            RUSTSEC-2021-0097
URL:           https://rustsec.org/advisories/RUSTSEC-2021-0097
Solution:      Upgrade to >=111.16
Dependency tree:
openssl-src 111.15.0+1.1.1k
└── openssl-sys 0.9.65
    ├── libssh2-sys 0.2.21
    │   └── libgit2-sys 0.12.25+1.3.0
    │       ├── systest 0.1.0
    │       └── git2 0.13.24
    │           └── git2-curl 0.14.1
    ├── libgit2-sys 0.12.25+1.3.0
    ├── git2 0.13.24
    ├── curl-sys 0.4.45+curl-7.78.0
    │   └── curl 0.4.38
    │       └── git2-curl 0.14.1
    └── curl 0.4.38

Crate:         openssl-src
Version:       111.15.0+1.1.1k
Title:         Read buffer overruns processing ASN.1 strings
Date:          2021-08-24
ID:            RUSTSEC-2021-0098
URL:           https://rustsec.org/advisories/RUSTSEC-2021-0098
Solution:      Upgrade to >=111.16

Crate:         time
Version:       0.1.43
Title:         Potential segfault in the time crate
Date:          2020-11-18
ID:            RUSTSEC-2020-0071
URL:           https://rustsec.org/advisories/RUSTSEC-2020-0071
Solution:      Upgrade to >=0.2.23
Dependency tree:
time 0.1.43
└── git2 0.13.24
    └── git2-curl 0.14.1

Crate:         term
Version:       0.4.6
Warning:       unmaintained
Title:         term is looking for a new maintainer
Date:          2018-11-19
ID:            RUSTSEC-2018-0015
URL:           https://rustsec.org/advisories/RUSTSEC-2018-0015
Dependency tree:
term 0.4.6
└── syntex_errors 0.59.1
    └── syntex_syntax2 0.0.2
        └── ctest 0.2.22
            └── systest 0.1.0

error: 3 vulnerabilities found!
warning: 1 allowed warning found

is it ok if I add a ci step checking this

I don't think that this is really all that necessary in this crate itself since this has somewhat low traffic to even see a warning and otherwise there is no Cargo.lock file which means that if the latest version of something is vulnerable then there's nothing that can be done anyway. If a major version bump needs to happen then that's fine to happen as a PR as well.


Update todo.js

Thanks a lot, and sorry for not coming back earlier.
Your changes are good but have been taken care of in other PRs, so they are no more needed.
Sorry for taking so much time to come back; we are adapting our processes to be quicker in the future (hopefully).
Again, thank you!


Put waiting imports in the end of the running imports rather than in the beginning

As suggested here https://github.com/Sp2000/colplus-frontend/issues/336

as we serve both running & finished pages through the same API I want to be clear about the sorting. Alternatively we could also offer 2 API methods for running & finished with a potentially different ordering.
Currently we order by priority then the date the request was created, regardless of the import state. That means running ones should always come before the queued ones as they were created earlier or have a higher priority. But I make sure this is always the case.
Apart from currently running ones I will keep the ordering by creation date

downloading
processing
inserting
indexing
building metrics
waiting
all finished states, ordered by creation date

https://github.com/Sp2000/colplus-backend/commit/50d40782637e9d78b682fbe1fd7dc92fc8d9c9c9
this does not sort the running ones by their state but by their started date


value out of range error

12:25:17.753 [error] <0.231.0> gen_fsm <0.231.0> in state connected terminated with reason: {value_out_of_range,-791} in mz_histogram:notify/2 line 71
12:25:17.774 [error] <0.231.0> CRASH REPORT Process <0.231.0> with 0 neighbours exited with reason: {value_out_of_range,-791} in mz_histogram:notify/2 line 71 in gen_fsm:terminate/7 line 626

Could this be caused by clock differences on amazon machines?

depends on what you measure,
you could call something like:
   _ = mzb_metrics:notify({"something", histogram}, -791)
and this issue reproduced,
it could be caused by time difference depending on worker code

Thanks, Renat.
So the gen_fsm crashing here does stop metrics collection, or affect my metrics, right?

It shouldn't affect metrics collection, it crashes only caller process

Okay, I see.
Thanks & enjoy your weekend!


Fix crash due to invalid view frames on iOS 9, fixes #7

Again, we should fix the root issue in DTRichTextEditor but this is a good failsafe.

@amro is this change still required or was it superseded by the selection rectangles fix?

I think the selection rectangles fix is sufficient. @Daij-Djan said this fix actually would not work on its own, so I suggest we remove it. In fact, if his fix prevents the crash on iOS 8 then we should remove -hideInvalidLayersInView: all together, in my opinion.

That said, it will not hurt if you want it as a precaution. If others make the same mistake and this catches it, then great. But we're really hiding the mistake.

Let's try without... would you mind putting together a PR to remove the unnecessary parts?

Yes. To be clear, you want a PR to remove -hideInvalidLayersInView:, correct?

Yes, I worry that the constant messing with the layers might be bad for performance anyway.. Somebody needs to try it on iOS 8 with the new fix though… but I have a feeling that it would probably work.

On 05 Oct 2015, at 20:01, Amro Mousa<EMAIL_ADDRESS>wrote:
Yes. To be clear, you want a PR to remove -hideInvalidLayersInView:, correct?
—
Reply to this email directly or view it on GitHub https://github.com/Cocoanetics/DTLoupe/pull/9#issuecomment-145615301.

I can attempt to remove the first commit - I'm not sure whether github will play nice with that or not.

Thank you @amro for your great efforts! Always sad to see so much code be leaving the project ... ;-)


defineExpose for using composition api with jsx/tsx syntax

What problem does this feature solve?
When some api methods don't use setup context, it can be exposed like following:
import { defineComponent } from 'vue'

export default defineComponent({
  setup() {
    retrun () =>

  },
  methods: {
    doSomething() {}
  }
})

But it difficulty to expose some api methods which are using setup context when using composition api with tsx syntax.
import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup() {
    const input = ref<HTMLElement | null>(null)

    // How to expose this method?
    function focus() {
      input.value?.focus()
    }

    retrun () => <input ref={input} />
  }
})

What does the proposed API look like?
import { defineComponent, ref, defineExpose } from 'vue'

export default defineComponent({
  setup() {
    const input = ref<HTMLElement | null>(null)

    function focus() {
      input.value?.focus()
    }

    // expose like in


fix: Cleanout old code

What kind of change does this PR introduce?

Cleanout future imports from __future__ import annotations no longer needed for Python >= 3.9.0.

@juancarlospaco do you have a pointer in the Python docs where this is noted please? I've been looking but haven't been able to find anything.

Closing this for now sorry, maybe in the future we can revisit the idea,
the official status is kinda "TBD" even if in practice works for years now.


Ansible request to fix MSVS_2013 broken installation

Ref:

https://ci.adoptopenjdk.net/job/VagrantPlaybookCheck/1160/

https://ci.adoptopenjdk.net/job/VagrantPlaybookCheck/OS=Win2012,label=vagrant/1153/

[ ] Missing install

[x] Bug in ansible playbook

[ ] Request for new playbook addition

Details:
Registering the MSVS_2013 shared libraries (this task), intermittently fails with :
10:59:23 TASK [MSVS_2013 : Register Visual Studio Community 2013 DIA SDK shared libraries] ***
10:59:26 failed: [<IP_ADDRESS>] (item=C:\Program Files (x86)\Microsoft Visual Studio 12.0\DIA SDK\bin\msdia120.dll) => {"ansible_loop_var": "item", "changed": true, "cmd": "regsvr32 /s \"C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\DIA SDK\\bin\\msdia120.dll\"", "delta": "0:00:00.093433", "end": "2021-05-05 09:57:05.619367", "item": "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\DIA SDK\\bin\\msdia120.dll", "msg": "non-zero return code", "rc": 3, "start": "2021-05-05 09:57:05.525933", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

(return code 3).
There's no stderr because regsvr32 is being run with /s, however that may help with debugging. See: https://devblogs.microsoft.com/oldnewthing/20180921-00/?p=99795 which may give some insight.
According to above, RC=3 means the loadlibrary call is failing (or that it's a red herring). Either way, removing /s will give some insight, so that's where I'll start.

It appears our MSVS_2013 installation is broken (I would assume from the same changes that Microsoft did that caused the MSVS_2010 installation to break). The playbook task will report the installation task as correct, but will then fail when registering the libraries ; When I tried MSVS_2013 installation on a local VM, I had an 'Unable to Locate Package Source' issue for VS_PreClean_vs.exe, whatever that means. Anyway, this issue has instead become about getting MSVS_2013 installed correctly

Related: https://github.com/AdoptOpenJDK/openjdk-infrastructure/issues/1270
Also, this is potentially an important consideration for @andrew-m-leonard as part of https://github.com/adoptium/temurin-build/issues/2522

If we could have a local copy of the installer available, as mentioned in https://github.com/adoptium/infrastructure/issues/1270, that could provide a solution for this

I have a fix for the VS2013 installation, by creating a local installation media for the Community Edition ( via MSDN subscription ), VS2013 can be installed. The new media has been placed in the vendor files, and Im working on the playbook changes to copy this media, and install from that, rather than via the web downloader.


Stricter pyright Setup

Add more type checks with pyright. This is a first stab just to gut check how much of a pain it is to enforce this officially vs. just as a strong suggestion for documentation (hint: it was pretty annoying).

@vincekurtz I realized when playing around with pyright tonight that we had really loose settings on type checking on main (not even talking about the strict setting, which is super pedantic about everything). When I adjusted this, there were a lot of errors that came up, many of them inscrutable and fairly difficult to solve. I ended up hacking the last few just to forcibly pass the pyright checks.
Here's my philosophy on this right now. Type hints are really useful, but are still just hints. I don't think we should strongly enforce typing (especially during CI), but I do think we should keep up a standard of typing things (and calling people out in review).
I also think that locally, it's not a bad idea to run pyright with slightly stricter settings because it actually does catch confusing typing, and this is useful to fix for clarity. However, more often than not, it complains about things which have basically no effect on clarity, and just kills dev time. About ~20% of the changes I made in this demonstration PR (not to be merged) were actually useful.


Add support for kpod kill

Kill one or more containers using a user-provided signal.  If not signal
is provided, KILL is used.
Signed-off-by: baude<EMAIL_ADDRESS>

Add info to kpod man page and to README.md and Transfer.MD

@mheon @umohnani8 PTAL

@baude Make the fix I suggested and then we can start the E2E tests.
Need this so errors go to stderr instead of stdout.
fmt.Fprintln(os.Stderr, lastError)

LGTM

[retest]

@baude Maybe add
+    run ${KPOD_BINARY} ${KPOD_OPTIONS} kill "k8s_podsandbox1-redis_podsandbox1_redhat.test.crio_redhat-test-crio_0"
+    echo "CTR_ID=" $ctr_id
+    echo "$output"

Then in the error you will know if the container you are killing my name matches the ctr_id?
  Merging


State of Cluster Credentials inconsistent when switching between Cluster Credentials and Create Cluster

The Cloud Credentials dropdown for AWS clusters is inconsistent with the available credentials when switching between the Create Cluster and Cloud Credentials sections of the UI.
Example below, workflow being:
Log in > Initial state is correct > go to Cloud Credentials > Delete Cloud Credential > Create Cluster > Deleted Cloud Credential visible in the dropdown
Add Cloud Credential > Create EKS Cluster > Cloud credential not listed in the dropdown
In both situations, if you refresh the page the drop down list contains the expected values.

I could not reproduce this issue on v2.6-head.
To test this,

I created two AWS credentials
Went to the form to create an EKS cluster and both credentials were there
Went to the form to create an EC2 node template and both credentials were there
Deleted one of the cloud credentials
Went to the form to create an EKS cluster and only the not-deleted credential was there
Went to the form to create an EC2 node template and only the not-deleted credential was there
Deleted the last remaining cloud credential
Went to the form to create an EKS cluster and no credentials were available
Went to the form to create an EC2 node template and no credentials were available

I think this is all working as expected.

Closing as Can Not Reproduce
I also couldn't reproduce this on 2.6-head (v2.6-0463e4cdeb2e693aa0dc9a013c2b6e9442191c7b-head)
Interesting thing to note was that when I used self-signed certs (like with a simple docker run of rancher), in Chrome, sometimes the page cache hides the fact that it seems Chrome expires the security exception and the page isn't updated. This made it appear sometimes as if that key was still present. A hard refresh would update the page and the key is actually gone.
Just using valid certs like in a production environment, this issue is not seen.


Debris Thermostat - Every other item is not cooled.

I am passing ~250C igneous rock through this and every 2nd item is not cooled.
[22C, 250C, 22C, 250C, 22C, 250C, 22C, 250C, 22C]

Ok, I will check it later.
---- Replied Message ----
| From | @.> |
| Date | 05/27/2024 13:41 |
| To | @.> |
| Cc | @.***> |
| Subject | [ttdly/ONI-Mods] Debris Thermostat - Every other item is not cooled. (Issue #34) |
I am passing ~250C igneous rock through this and every 2nd item is not cooled.
[22C, 250C, 22C, 250C, 22C, 250C, 22C, 250C, 22C]
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: @.***>

Sorry, I cannot reproduce this problem.

It persists through a full restart of the game.
Using the DLC.
The filter is made of steel and placed into 50kg of steam for steam turbines.
Set to 22C.

Ok, thanks for the addtional infomation.
---- Replied Message ----
| From | @.> |
| Date | 05/27/2024 22:12 |
| To | @.> |
| Cc |<EMAIL_ADDRESS>|
| Subject | Re: [ttdly/ONI-Mods] Debris Thermostat - Every other item is not cooled. (Issue #34) |
It persists through a full restart of the game.
Using the DLC.
The filter is made of steel and placed into 50kg of steam for steam turbines.
Set to 22C.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: @.***>

This appears to have resolved the issue. Thank you for your work!


Failed to load a language-rampcode package grammar

[Enter steps to reproduce:]

...
...

Atom: 1.38.1 x64
Electron: 2.0.18
OS: Microsoft Windows 7 Ultimate
Thrown From: language-rampcode package 0.2.0
Stack Trace
Failed to load a language-rampcode package grammar
At Cannot read property 'value' of undefined in C:\Users\~~Black~Devile~~\.atom\packages\language-rampcode\grammars\tree-sitter-rampcode.cson

TypeError: Cannot read property 'value' of undefined
    at Parser.parentheses (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:2743027)
    at Parser.parse (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:2746386)
    at Parser.loop (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:2746212)
    at new Parser (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:2739295)
    at Processor.process (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:1099728)
    at SyntaxScopeMap.addSelector (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:1084805)
    at new SyntaxScopeMap (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:14:1083679)
    at new TreeSitterGrammar (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:11:3461528)
    at GrammarRegistry.createGrammar (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:11:358917)
    at l.readFile (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:11:358758)
    at u (~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:11:578864)
    at ~/AppData/Local/atom/app-1.38.1/resources/app/static/<embedded>:11:580101
    at FSReqWrap.oncomplete (fs.js:152:21)
  at /packages/language-rampcode/grammars/tree-sitter-rampcode.cson:1:1

Commands
     -7:24 welcome:show (div.panels-item)
     -7:19.7.0 application:open (atom-workspace.workspace.scrollbars-visible-always.theme-one-dark-syntax.theme-one-dark-ui.teletype-Authenticated)

Non-Core Packages
atom-material-syntax 1.0.8
atom-material-ui 2.1.3
atom-rampcode 0.2.2
language-rampcode 0.2.0
teletype 0.13.4

Thanks report, new patch released. Please try to update this package.


chore: cleanup PR check-in VHD builds, move builds to MSFT

What type of PR is this?

/kind cleanup
What this PR does / why we need it:
simplify check-in VHD build pipeline yaml
Which issue(s) this PR fixes:

Fixes #
Requirements:

[ ] uses conventional commit messages

[ ] includes documentation
[ ] adds unit tests
[ ] tested upgrade from previous version

Special notes for your reviewer:
Release note:
none

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall first build on cameissner/checkin at 61.51%

Totals

Change from base Build<PHONE_NUMBER>:
61.5%

Covered Lines:
2680

Relevant Lines:
4357

💛  - Coveralls


Temp no orphan

Description
Do not merge!
This is just a temporary thing.
Changes
This allows you to disable the checks.
If you just want to disable the project orphan checks do this:
with cript.API(None, None, None) as api:
   api.no_orphan_checks = True
   #...

You can also disable DB schema tests in general:
with cript.API(None, None, None) as api:
   api.no_schema_checks = True
   #...

formally implemented.


Filter apis() using custom RequestHandlerSelectors

This is a question. Using Springfox 2.7.0
I am trying to create multiple docs ("internal" and "external" and few more) from the same code. Some apis are part of all while some should only show in certain ones. I see RequestHandlerSelectors and I can create a custom annotation and using that I can do a boolean selection (withMethodAnnotation).
What I would like to do is have an annotation such as:
public @interface QualifiedMapping {
    public enum Qualifiers {
        FOO, BAR, BAZ;
    }

    Qualifiers[] value();
}

So I can annotate my method as:
@QualifiedMapping({Qualifiers.FOO, Qualifiers.BAR})

Now how do I author the RequestHandlerSelectors so that I can restrict the correct mappings to each of the dockets? (Each of Foo, Bar, Baz is its own docket). If I don't annotate this then it applies to all dockets. I would appreciate any guidance.
Thanks

you can create your own Predicate that handles this. In 2.9.2 you can use
RequestHandler.findAnnotation to find that annotation and create a predicate that results in a  true or false to your liking

I want to filter in runtime - not only on bootstrap. Reason behind this is that depending on user credentials, different endpoints might be listed.


feature/docs

Update outdated documentation and add more descriptive documentation about how to use the microservice and its code.

I'll close this and merge the updated #22 instead.


Find-bar error message foreground-color has insufficient contrast in dark mode

Configuration:

Web browser and its version: Firefox Nightly 114.0a1 (2023-04-26) (64-bit)
Operating system and its version: Ubuntu 22.04
PDF.js version: Unknown; whatever ships with this Firefox Nightly version.
Is a browser extension: not explicitly; just using the version that ships with Firefox Nightly

Steps to reproduce the problem:

Configure your browser to prefer dark color-schemes -- in Firefox preferences, search for "dark" and then choose "Website appearance: Dark"
View some PDF in an iframe (so that the PDF.js find-in-document UI shows up).  For example, view this data URI:

data:text/html,<iframe height=400 width=1200
src="https://manuals.plus/m/5c4b852e59e3baa224c5fe39cde777d5adecd5b2ac5171dfda43cf3ec3f3e979.pdf">

Click the magnifying glass icon at the top left of the PDF.js UI
Type in some gibberish string that won't be found, and look at the "Phrase not found" error-message text.

What is the expected behavior?
The error message should be readable.
What went wrong? (add screenshot)
The error message is hard to read; there isn't sufficient contrast, particularly given that this is small text.
Screenshot:

The foreground color here is defined as rgba(251, 0, 0, 1) here:
https://github.com/mozilla/pdf.js/blob/598408b7af9688e4a85d47fe47227ce32f993017/web/viewer.css#L630-L631
and it's the same color regardless of color-scheme.  (It's quite readable in a light color scheme with a light background, but harder to read with a dark color scheme).
The background color is --toolbar-bg-color which is rgba(56, 56, 61, 1)
WebAIM contrast analysis for these colors:
https://webaim.org/resources/contrastchecker/?fcolor=FB0000&bcolor=38383D
which rates it as "fail" (insufficiently contrasting) in all categories.

Note "Phrase not found" is fairly easy to read/recognize.  Here's a screenshot with another error message in the same UI where this is a bit harder to read due to there being more words & longer words:

For comparison, here are screenshots in light mode, where this shade of red is much more readable over the rgba(249, 249, 250, 1) background-color:

(As it happens, WebAIM still rates this a "fail" for most categories, but the contrast ratio is substantially higher:
https://webaim.org/resources/contrastchecker/?fcolor=FB0000&bcolor=F9F9FA )

I wonder if we should just do the same thing as the Firefox findbar, and make that message-text bold instead (and thus remove the red colour)?


[Device Support Request] add TS0011 Tuya no neutral switch

Is your feature request related to a problem? Please describe.
This device is no neutral tuya switch. I can include it with ZHA but, when switch is pairing with ZHA, it turns off itself.
I found same problem on github with deconz, but it seems to be ok with z2M:
https://github.com/dresden-elektronik/deconz-rest-plugin/issues/3693
perhaps this device need to use one quirks and not classic zigbee device...
Device signature - this can be acquired by removing the device from ZHA and pairing it again from the add devices screen. Be sure to add the entire content of the log panel after pairing the device to a code block below this line.
{
  "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0100",
      "in_clusters": [
        "0x0000",
        "0x0004",
        "0x0005",
        "0x0006"
      ],
      "out_clusters": [
        "0x000a",
        "0x0019"
      ]
    }
  },
  "manufacturer": "_TZ3000_9hpxg80k",
  "model": "TS0011",
  "class": "zigpy.device.Device"
}

Additional context
Add any other context or screenshots about the feature request here.

Same problem here

Same issue. I bought 2 ts0012 for testing.
Switch is working well when not appaired.
Once appaired, it shut off after 2 minutes

Same problem with TS0013.
Once paired turns itself off after 2 minutes.

Do you know switches with 2 buttons, no neutral needed, EU format compatible that I can buy safely for my Conbee II ?

Same problem here with TS0011, and 2* TS0012
I saw this conversation about device handler for smartthings, is it portable for a quirck for us?
https://community.smartthings.com/t/uk-light-switches-my-experiences-2020/196035/95
Seems to be a routine check that happens evert 2min to check brand of the device (that would differ).

Here is a post I found about this issue and a change made to fix it :
https://www.gitmemory.com/issue/zigpy/zha-device-handlers/535/715596185
I did not test it yet.

The original post: https://github.com/zigpy/zha-device-handlers/issues/535

The original post: #535

Thanks, in the mean time I tested it and it does not work, as stated in the complete original post.

Correction, I managed to make my TS0012 work with this quirck (based on post #535 + TS0042.py) :
`class TuyaNoNeutralDoubleSwitch(TuyaSwitch):
"""Tuya double channel switch device."""
signature = {
    # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
	# maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
	# maximum_outgoing_transfer_size=82, descriptor_capability_field=0)"
    # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=0x0100, input_clusters=[0x0000,0x0004, 0x0005,0x0006], output_clusters=[0x000a, 0x0019]))
    # SizePrefixedSimpleDescriptor(endpoint=2, profile=260, device_type=0x0100, input_clusters=[0x0004, 0x0005,0x0006,], output_clusters=[])
    MODELS_INFO: [("_TZ3000_fvh3pjaz", "TS0012")],
    ENDPOINTS: {
        1: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Basic.cluster_id,
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
        },
        2: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [],
        }
    }
}

replacement = {
    ENDPOINTS: {
        1: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Basic.cluster_id,
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [Ota.cluster_id],
        },
        2: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [],
        }
    }
}

device_automation_triggers = {
    (SHORT_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS},
    (LONG_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS},
    (DOUBLE_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS},
    (SHORT_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: SHORT_PRESS},
    (LONG_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: LONG_PRESS},
    (DOUBLE_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: DOUBLE_PRESS},
}`

Seems that the OUTPUT_CLUSTER "Time.cluster_id" could be responsible for the problem.

Correction, I managed to make my TS0012 work with this quirck (based on post #535 + TS0042.py) :

Hello, Is this correction specific to ZHA ? or can it be applied to Deconz directly ?

It seems Jeedom and Deconz will be too slow to solve the issue.
So I'm trying to migrate from Jeedom to Home Assistant. Installation is done, Zigbee working ... with of course still the issue of switch off after 2 minutes. How to I test the "quirck" below ? Thank you

You have to install the project zha-device-handlers (explanation on main page of the project)
then create a "ts0012.py" (below) file in the "/zhaquirks/tuya/" directory (or ts0011, if 1 switch version),
then remove directories "pycache/" in zhaquirks/ and "/zhaquirks/tuya/" folders
Worked for me, then problem yesterday, repaired device and now ok since then.
file ts0012.py:
`"""Tuya 2 Button Switch."""
from zigpy.profiles import zha
from zigpy.zcl.clusters.general import Basic, Groups, Scenes, OnOff, Ota, PowerConfiguration, Time
from zhaquirks.const import (
BUTTON_1,
BUTTON_2,
COMMAND,
DEVICE_TYPE,
DOUBLE_PRESS,
ENDPOINT_ID,
ENDPOINTS,
INPUT_CLUSTERS,
LONG_PRESS,
MODELS_INFO,
OUTPUT_CLUSTERS,
PROFILE_ID,
SHORT_PRESS,
)
from zhaquirks.tuya import (
TuyaSwitch
)
class TuyaNoNeutralDoubleSwitch(TuyaSwitch):
"""Tuya double channel switch device."""
signature = {
    # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
	# maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
	# maximum_outgoing_transfer_size=82, descriptor_capability_field=0)"
    # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=0x0100, input_clusters=[0x0000,0x0004, 0x0005,0x0006], output_clusters=[0x000a, 0x0019]))
    # SizePrefixedSimpleDescriptor(endpoint=2, profile=260, device_type=0x0100, input_clusters=[0x0004, 0x0005,0x0006,], output_clusters=[])
    MODELS_INFO: [("_TZ3000_fvh3pjaz", "TS0012")],
    ENDPOINTS: {
        1: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Basic.cluster_id,
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
        },
        2: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [],
        }
    }
}

replacement = {
    ENDPOINTS: {
        1: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Basic.cluster_id,
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [Ota.cluster_id],
        },
        2: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Groups.cluster_id,
                Scenes.cluster_id,
				OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [],
        }
    }
}

device_automation_triggers = {
    (SHORT_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS},
    (LONG_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS},
    (DOUBLE_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS},
    (SHORT_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: SHORT_PRESS},
    (LONG_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: LONG_PRESS},
    (DOUBLE_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: DOUBLE_PRESS},
}`

Many thanks for this work, I've been struggling to get to grips with it for a few days now.
FWIW I don't think you need the "device_automation_triggers" section for these switches.
Finally got my TS0013 to work and stay on with this...
file ts0013.py
"""Tuya 3 gang no neutral light switch."""
from zigpy.profiles import zha
from zigpy.zcl.clusters.general import Basic, Groups, Scenes, OnOff, Ota, Time
from zhaquirks.const import (
COMMAND,
DEVICE_TYPE,
ENDPOINT_ID,
ENDPOINTS,
INPUT_CLUSTERS,
MODEL,
MODELS_INFO,
OUTPUT_CLUSTERS,
PROFILE_ID,
SKIP_CONFIGURATION,
)
from zhaquirks.tuya import (
TuyaSwitch,
)
class TuyaTripleNoNeutralSwitch(TuyaSwitch):
"""Tuya 3 gang no neutral light switch."""
signature = {
#"NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128,
#manufacturer_code=4098, maximum_buffer_size=82,
#maximum_incoming_transfer_size=82, server_mask=11264,
#maximum_outgoing_transfer_size=82, descriptor_capability_field=0)",
MODEL: "TS0013",
ENDPOINTS: {
# <SimpleDescriptor endpoint=1 profile=260 device_type=100
# device_version=1
# input_clusters=[0, 4, 5, 6]
# output_clusters=[a, 19]>
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
INPUT_CLUSTERS: [
Basic.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id
],
OUTPUT_CLUSTERS: [
Time.cluster_id,
Ota.cluster_id
]
},
# <SimpleDescriptor endpoint=2 profile=260 device_type=100
# device_version=1
# input_clusters=[4, 5, 6]
# output_clusters=[]>
2: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
INPUT_CLUSTERS: [
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id
],
OUTPUT_CLUSTERS: []
},
# <SimpleDescriptor endpoint=3 profile=260 device_type=100
# device_version=1
# input_clusters=[4, 5, 6]
# output_clusters=[]>
3: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
INPUT_CLUSTERS: [
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id
],
OUTPUT_CLUSTERS: []
}
}
}
replacement = {
    SKIP_CONFIGURATION: True,
    ENDPOINTS: {
        1: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Basic.cluster_id,
                Groups.cluster_id,
                Scenes.cluster_id,
                OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: [Ota.cluster_id]
        },
        2: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Groups.cluster_id,
                Scenes.cluster_id,
                OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: []
        },
        3: {
            PROFILE_ID: zha.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
            INPUT_CLUSTERS: [
                Groups.cluster_id,
                Scenes.cluster_id,
                OnOff.cluster_id
            ],
            OUTPUT_CLUSTERS: []
        }
    }
}

===========================
And sACLeFR if you look at https://github.com/zigpy/zha-device-handlers it will tell you how to implement quirks in homeassistant.

You have to install the project zha-device-handlers (explanation on main page of the project)
then create a "ts0012.py" (below) file in the "/zhaquirks/tuya/" directory (or ts0011, if 1 switch version),
then remove directories "pycache/" in zhaquirks/ and "/zhaquirks/tuya/" folders
Worked for me, then problem yesterday, repaired device and now ok since then.

Thank you, will test that this week !

And sACLeFR if you look at https://github.com/zigpy/zha-device-handlers it will tell you how to implement quirks in homeassistant.

Thank you. I think I understood how to implement a quirk once zha-device-handlers is installed ... but the documentation don't explain (or I didn't understood) how to install zha-device-handlers itself
Is it just the folders to copy/paste ?

If you’re using HA it’s pulled in by ZHA already

This week-end had test some different quirk.
I attache a file which contain 3 Quirks for : TS0011, TS0012, TS0013.
It seems work for me for TS0011, but I will test to delete and re appair the device tonight.
Can you test with this file, before propose pull-request ?
"""Tuya 1,2,3 gang no neutral light switch."""

from zigpy.profiles import zha
from zigpy.zcl.clusters.general import Basic, Groups, Scenes, OnOff, Ota, Time

from zhaquirks.const import (
    COMMAND,
    DEVICE_TYPE,
    ENDPOINT_ID,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODEL,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
    SKIP_CONFIGURATION,
)

from zhaquirks.tuya import (
    TuyaSwitch,
)

class TuyaSingleNoNeutralSwitch(TuyaSwitch):

    """Tuya 1 gang no neutral light switch."""
    signature = {
        #"node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
        #                       maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
        #                       maximum_outgoing_transfer_size=82, descriptor_capability_field=0)

        MODELS_INFO: [("_TZ3000_9hpxg80k", "TS0011")],
        ENDPOINTS: {
        # <SimpleDescriptor endpoint=1 profile=260 device_type=100
        # device_version=1
        # input_clusters=[0, 4, 5, 6]
        # output_clusters=[a, 19]>
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id],
            },
         },
    }

    replacement = {
        SKIP_CONFIGURATION: True,
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id],
            },

        },
    }

class TuyaDoubleNoNeutralSwitch(TuyaSwitch):

    """Tuya 2 gang no neutral light switch."""
    signature = {
        #"node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
        #                       maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
        #                       maximum_outgoing_transfer_size=82, descriptor_capability_field=0)

        # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
                                # maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
                                # maximum_outgoing_transfer_size=82, descriptor_capability_field=0)"

        MODELS_INFO: [("_TZ3000_fvh3pjaz", "TS0012")],
        ENDPOINTS: {
            # <SimpleDescriptor endpoint=1 profile=260 device_type=100
            # device_version=1
            # input_clusters=[0, 4, 5, 6]
            # output_clusters=[a, 19]>
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id],
            },
            # <SimpleDescriptor endpoint=2 profile=260 device_type=100
            # device_version=1
            # input_clusters=[4, 5, 6]
            # output_clusters=[]>
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [],
            },
         },
    }

    replacement = {
        SKIP_CONFIGURATION: True,
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id],
            },
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [],
            },

        },
    }

class TuyaTripleNoNeutralSwitch(TuyaSwitch):

    """Tuya 3 gang no neutral light switch."""
    signature = {
        #"node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
        #                       maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
        #                       maximum_outgoing_transfer_size=82, descriptor_capability_field=0)

        # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
                                # maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
                                # maximum_outgoing_transfer_size=82, descriptor_capability_field=0)"

        MODEL: "TS0013",
        ENDPOINTS: {
            # <SimpleDescriptor endpoint=1 profile=260 device_type=100
            # device_version=1
            # input_clusters=[0, 4, 5, 6]
            # output_clusters=[a, 19]>
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id],
            },
            # <SimpleDescriptor endpoint=2 profile=260 device_type=100
            # device_version=1
            # input_clusters=[4, 5, 6]
            # output_clusters=[]>
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [],
            },
            # <SimpleDescriptor endpoint=3 profile=260 device_type=100
            # device_version=1
            # input_clusters=[4, 5, 6]
            # output_clusters=[]>
            3: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [],
            },
         },
    }

    replacement = {
        SKIP_CONFIGURATION: True,
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id],
            },
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [],
            },
            3: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [],
            },
        },
    }

I confirm, it works for me with TS0011 !

I tried to include it in Jeedom Zigbee plugin (based on zigpy) but no success.
I was hoping some magic maybe but we have there a folder resources/zigbeed/quirks/
In ZHA I didn't find where to load the file py

I don't know integration of zigpy on jeedom..
For HA, what is your type of installation : supervised , OS ?

Now I'm more confused...
Upgraded HA to 2021.4.0 and, as expected, the custom quirk was removed. BUT the TS0013 still works and does not turn itself off.  So, on the basis that if it ain't bust don't fix it, I'm leaving it without the quirk for now.

@kev-kclub  ,
Yes wait in order to see,
But i'm curious if you delete your TS0013, and try to reinclude without the quirk.

@sACLeFR can you test this PR ? https://github.com/zigpy/zha-device-handlers/pull/845
Say me what is your installation type: OS or supervised ?

@sACLeFR can you test this PR ? https://github.com/zigpy/zha-device-handlers/pull/845
Say me what is your installation type: OS or supervised ?

i'm on OS installation.
(I had to check because I used an installation script specific to create a vm on Proxmox)
Do you have a step by step how to activate quirks and where to save the py file ?
I admit I got lost from my readings.
It's a test vm so no problem to do activate some beta tools if needed.
Thanks.

@sACLeFR
ok step by step:

download this file:
https://github.com/sylvaing/zha-device-handlers/blob/d2923252181b630520ede941917d75c80961829a/zhaquirks/tuya/ts001x.py

connect to homehassistant web interface and upload file with file editor:

browse direcory with top left icon of direcory
click on icon to upload ( the arrow)

log as root on your proxmox VM

connect to your docker homeassistant container with: docker exec -it homeassistant /bin/bash

copy ts001x.py file to the correct direcory:
cp /config/ts001x.py /usr/local/lib/python3.8/site-packages/zhaquirks/tuya/

rm cache directory:
rm -rf /usr/local/lib/python3.8/site-packages/zhaquirks/tuya/__pycache__/ /usr/local/lib/python3.8/site-packages/zhaquirks/__pycache__/

you can now restart home assitant from web interfaces and test your device.

connect to your docker homeassistant container with: docker exec -it homeassistant /bin/bash

I'm locked at this stage

docker exec --help
Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
-d, --detach               Detached mode: run command in the background
--detach-keys string   Override the key sequence for detaching a
container
-e, --env list             Set environment variables
--env-file list        Read in a file of environment variables
-i, --interactive          Keep STDIN open even if not attached
--privileged           Give extended privileges to the command
-t, --tty                  Allocate a pseudo-TTY
-u, --user string          Username or UID (format:
<name|uid>[:<group|gid>])
-w, --workdir string       Working directory inside the container

I tried -i alone, -t alone
and "docker exec homeassistant /bin/bash"

Ok, this step are for supervised installation, you must have os installation.
Si try to install portainer addon on ha and connect you to your container console with portainer

Thanks a lot!  It's working properly!!

Hello, someone can explain me what do the quirk (from zigbee side)
I don't understand how hiding the ouput time cluster, can change something on the normal working mode ?

I think (without knowing) that the switch dont like the time its getting from the coordinator and therefor starting doing strange things.
The ZHA users have only disabling the time cluster (by exuding the cluster in the replacement part of the quirk) so ZHA is not using  it = can not answer the time requests from the device so it not being so "confused" and continuing working as one "normal" Zigbee switch.
The quirk code: https://github.com/weddle/zha-device-handlers/commit/ccdc7ade86300cc863c2a6bde03c0d65024201cf

But it don't prevent the device trying to read the attribute on the gateway (or I don't know how, hiding the cluster on the lib have no impact on the device working mode, no ?)
I m trying to do same, But I do that on gateway side, I don't answer when the device ask for local time, and I m unsuccessfull.

The ZHA Quirk is only preventing  ZHA using the time cluster so it can using it, the device still can reading the endpoints and cluster of the coordinator and trying using then but ZHA  is ignoring all that  have with the time cluster form this devices.
I think its on safety function then sending timed commands to the device but its one "normal zigbee device" so no tuya commands is sent (wot i have seen but you is never knowing with some manufactures).
Look on it as one LIDL weather valve that is turning it self off if not getting any more commands for safety but without the tuya DPs.
By the way gratings to @Mimiix and hope hi have not blocking all the rest nice de(F)CONNZ users there ;-))

Hello, someone can explain me what do the quirk (from zigbee side)
I don't understand how hiding the ouput time cluster, can change something on the normal working mode ?
I'm not a zigpy specialist, but I beleive that if the Time cluster is hidden, then when the zigpy library will get a request from the device on that cluster , it will simply respond "Not Supported"

Ha yep right, for the moment I just ignore it, will try with a "not supported"

The ZHA Quirk is only preventing ZHA using the time cluster so it can using it, the device still can reading the endpoints and cluster of the coordinator and trying using then but ZHA is ignoring all that have with the time cluster form this devices.

But I m almost sure ZHA never use this cluster, it s only used by somes devices themself, so if ZHA doesn't do "magic" on them and let the device reading the attribute, the quirk change nothing for me.

I think its on safety function then sending timed commands to the device but its one "normal zigbee device" so no tuya commands is sent (wot i have seen but you is never knowing with some manufactures).

The problem is the orignal gateway send less request than the generic one ^^, And like you saif nothing special, only classic request

By the way gratings to @Mimiix and hope hi have not blocking all the rest nice de(F)CONNZ users there ;-))

Lol, no don't worry, zigbee community  is  a small family

Zigpy will respond to read attribute request on the time cluster. It works fine with compliant devices, at least centralite thermostat gets the time from the server correctly.
But because tuya is its own thing, tuya has own commands for setting the time. I'm pretty sure same issues were faced by  Moe's radiator valve quirk author.

Zigpy will respond to read attribute request on the time cluster.

But even with the "quirk" ?

I think the tuya TRVs is setting the time with tuya (DP) commands and different way counting the time for different versions (ala tuya).
Many tuya lights also having the time cluster and that is not needed for "normal zigbee devices" like the LIDL LED strip and is working OK with "standard setting" without quirks with both RGB and TC with normal commands.

I think the tuya TRVs is setting the time with tuya (DP) commands and different way counting the time for different versions (ala tuya).

Yep, I have that for lot of TRV, and 2 different epoch used.

Ok so for information, playing with time cluster have worked.
But just with NO configure reporting AT ALL solve the issue, the device still working, but without the auto power off (still on bench)

Its one real nasty tuya implementation. Way have tuya not implanting it with on with time off and using it as manufacture command and have doing the off time in minutes instead of seconds.
One more problem you was having with devices 0x017 (old Philips HUE devices) is not aging out neighbors so if removing one device the HUEs  is still reporting they is still in the network to the coordinator until you is resetting the HUE device (i have removed the last HUE light from my production system and putting in IKEA CWS3).
And one more tuya is the TS004F is one more or less one Zigbee dimmer switch that is sending very normal On/Off and Level commands ala Zigbee Light standard but the user is saying its one 12 scene switch that is wrong.
I think you is needing one TYGWZ01 or 2 for testing plus all devices tuuya is putting out in the market.

Related to this issue I started the following topic on the community: https://community.home-assistant.io/t/user-experience-request-differernt-zigbee-tuya-based-touch-light-switches/439249
Any contributions to experience with these devices are very welcome!


feat: Update navbar

Fixes #4413
Describe the changes you have made in this PR -
Updated the Navbar so that it does not overlap with the website. It would create a border at the bottom of the navbar.
Screenshots of the changes (If any) -

Note: Please check Allow edits from maintainers. if you would like us to assist in the PR.

@tanmoysrt can you please review this ?


getInitialLink returns the same link when app brought to foreground from background

Get initialLink() returns the same link when the app is brought from background to foreground without clicking the link
To Reproduce
Steps to reproduce the behavior:

I launched the app by clicking a deep link and triggered getIntialLink()
I moved the app to the background by pressing the home button
And then brought it back to foreground the getInitialLink() got triggered it should have returned null
but it returns the same link the app was launched with;

Expected behavior
I think the expected behavior is it should have returned null when brought to foreground from background;
let me know If I am wrong or you have a different opinion

I've updated the README to highlight that both getInitialLink and getInitialUri should be handled only once during app's life. You can call it as many times as you wish to get the link that started the app (or store the value in a global place), but you should only handle it once.
For future link invocations of the app you should use the linkStream or uriLinkStream. They will produce a link when the OS wants to either foreground your backgrounded app or if your app is already in the foreground - to receive data from another app (mostly on a tablet when two apps are on-screen, side by side).

@avioli the problem is getInitialLink returns the same link even after app's life ends. So the same link opens appear again and again without even being invoked. I think you should see this gif here

This issue still exist on v0.4.0. how to solve it?


self.sf.query_all() uses wrongly constructed path

self.sf.query_all() method uses wrongly constructed path.
Actual: /services/data/v42.0/query/?q=
Should Be: /services/data/v42.0/queryAll/?q=

This seems to be related to simple_salesforce\api.py and there def query_all function seems to mean different things than using queryAll in the URL path, so closing this one.


Control Replication Merge to Master

See merge request:
https://gitlab.com/StanfordLegion/legion/-/merge_requests/157
TODO list:

[x] Finish refactoring of instances for issue #546
[x] Refactor control replication to use the replicated instances for inline mappings and attach ops
[x] Teach Legion Spy to validate inline mappings and attach operations in control replication
[x] Detection of violations of control replication need to be improved
[x] Verify semantics of attach/detach and inline mappings for control replication
[ ] Improve default mapper behavior for control replication (tracked in #896)
[x] Fix implementation of premap_task
[ ] Ensure we have coverage of non-replicated Regent workloads in CI (@streichler )

We can check off box 5 once we disable support for simultaneous coherence and relaxed coherence for inline mappings in control replicated contexts.

Instance refactoring towards the first bullet point is being tracked with this merge request

Most of the remains undone due to new equivalence set work. Moving to the next milestone.

Issue #546 has been completed and merged into the control replication branch. Probably the only thing left to do on the Legion side now is #1309 which is a proxy issue for fixing the equivalence set refinement heuristics.

Adding this to failing test to the requirements for the merge: http://sapling2.stanford.edu/~rupanshu/reproducer.cc

@rupanshusoi @elliottslaughter To handle the case you raised above, I've added support for control replication of tasks with region requirements in the fixcrmap branch (upstream from the shardrefine branch). It requires a backwards breaking change to the mapper interface for control replication which will need to be discussed at a Legion meeting. The interface is simpler than before and decouples the replication of tasks from mapping them, and is slightly backwards compatible through the default mapper (more on this in the meeting). There is a new mapper call named replicate_task which decides if and how to replicate a task, and then each of the copies (aka shards) will be mapped by map_task like normal. I've updated your example to use the new mapping interface (see attached). It runs in lots of different configurations with the fixcrmap branch. Note that it will also work if you mark the reader task as a leaf task.
reproducer.tar.gz

The shardrefine branch was merged as of yesterday adding support for better heuristics for selecting equivalence sets:
https://gitlab.com/StanfordLegion/legion/-/merge_requests/560

The control replication branch is finally merged.