all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.4
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      configure_swap_size: 8192
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
          /etc/magnum/magnum.conf:
            cluster_template:
              kubernetes_allowed_network_drivers: calico,cilium
              kubernetes_default_network_driver: calico
            nova_client:
              api_version: 2.15
          /etc/manila/manila.conf:
            generic:
              connect_share_server_to_tenant_network: true
              driver_handles_share_servers: true
      devstack_localrc:
        ADMIN_PASSWORD: secretadmin
        DATABASE_PASSWORD: secretdatabase
        DEBUG_LIBVIRT_COREDUMPS: true
        DISABLE_AMP_IMAGE_BUILD: true
        ENABLE_SYSCTL_MEM_TUNING: true
        ENABLE_SYSCTL_NET_TUNING: true
        ENABLE_ZSWAP: true
        ERROR_ON_CLONE: true
        FIXED_RANGE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        GIT_BASE: https://github.com
        HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
        MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
        MANILA_ENABLED_BACKENDS: generic
        MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
        NETWORK_GATEWAY: 10.1.0.1
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        NOVA_VNC_ENABLED: true
        OCTAVIA_NODE: api
        OVN_DBS_LOG_LEVEL: dbg
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        RABBIT_PASSWORD: secretrabbit
        SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4'']
          }}'
        SERVICE_PASSWORD: secretservice
        SWIFT_HASH: 1234123412341234
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
      devstack_plugins:
        barbican: https://github.com/openstack/barbican
        magnum: https://review.opendev.org/openstack/magnum
        magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
        manila: https://github.com/openstack/manila
        octavia: https://github.com/openstack/octavia
        ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
      devstack_services:
        base: false
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        dstat: false
        etcd3: true
        file_tracker: true
        g-api: true
        horizon: false
        key: true
        memory_tracker: true
        mysql: true
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        o-api: true
        o-da: true
        o-hk: true
        octavia: true
        openstack-cli-server: true
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        placement-api: true
        q-ovn-agent: true
        q-svc: true
        rabbit: true
        s-account: false
        s-container: false
        s-object: false
        s-proxy: false
        tempest: false
        tls-proxy: true
      extensions_to_txt:
        auto: true
        conf: true
        localrc: true
        log: true
        stackenv: true
      image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
        kube_tag }}.qcow2
      kube_tag: v1.32.12
      network_driver: calico
      nodepool:
        az: nova
        cloud: public
        external_id: fe1b0fa6-b8b0-4951-a7ef-8f2b2b6d2415
        host_id: dc47ae3b6bd7105f226a81ddfc9102f715bac5cc73984e91b5981caa
        interface_ip: 199.204.45.4
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.4
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.4
        public_ipv6: 2604:e100:1:0:f816:3eff:fe74:a05f
        region: ca-ymq-1
        slot: null
      zuul_copy_output:
        /etc/ceph: logs
        /etc/glusterfs/glusterd.vol: logs
        /etc/libvirt: logs
        /etc/lvm: logs
        /etc/resolv.conf: logs
        /etc/sudoers: logs
        /etc/sudoers.d: logs
        /var/log/ceph: logs
        /var/log/glusterfs: logs
        /var/log/libvirt: logs
        /var/log/mysql: logs
        /var/log/openvswitch: logs
        /var/log/postgresql: logs
        /var/log/rabbitmq: logs
        /var/log/unbound.log: logs
        '{{ devstack_conf_dir }}/.localrc.auto': logs
        '{{ devstack_conf_dir }}/.stackenv': logs
        '{{ devstack_conf_dir }}/local.conf': logs
        '{{ devstack_conf_dir }}/localrc': logs
        '{{ devstack_full_log}}': logs
        '{{ devstack_log_dir }}/atop': logs
        '{{ devstack_log_dir }}/devstacklog.txt': logs
        '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
        '{{ devstack_log_dir }}/dstat-csv.log': logs
        '{{ devstack_log_dir }}/qemu.coredump': logs
        '{{ devstack_log_dir }}/tcpdump.pcap': logs
        '{{ devstack_log_dir }}/worlddump-latest.txt': logs
        '{{ stage_dir }}/apache': logs
        '{{ stage_dir }}/apache_config': logs
        '{{ stage_dir }}/audit.log': logs
        '{{ stage_dir }}/core': logs
        '{{ stage_dir }}/deprecations.log': logs
        '{{ stage_dir }}/df.txt': logs
        '{{ stage_dir }}/dpkg-l.txt': logs
        '{{ stage_dir }}/etc': logs
        '{{ stage_dir }}/iptables.txt': logs
        '{{ stage_dir }}/listen53.txt': logs
        '{{ stage_dir }}/mount.txt': logs
        '{{ stage_dir }}/performance.json': logs
        '{{ stage_dir }}/pip2-freeze.txt': logs
        '{{ stage_dir }}/pip3-freeze.txt': logs
        '{{ stage_dir }}/rpm-qa.txt': logs
        '{{ stage_dir }}/services.txt': logs
        '{{ stage_dir }}/verify_tempest_conf.log': logs
      zuul_node:
        az: nova
        cloud: public
        external_id: fe1b0fa6-b8b0-4951-a7ef-8f2b2b6d2415
        host_id: dc47ae3b6bd7105f226a81ddfc9102f715bac5cc73984e91b5981caa
        interface_ip: 199.204.45.4
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.4
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.4
        public_ipv6: 2604:e100:1:0:f816:3eff:fe74:a05f
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    configure_swap_size: 8192
    devstack_local_conf:
      post-config:
        $NEUTRON_CONF:
          DEFAULT:
            global_physnet_mtu: '{{ external_bridge_mtu }}'
        /etc/magnum/magnum.conf:
          cluster_template:
            kubernetes_allowed_network_drivers: calico,cilium
            kubernetes_default_network_driver: calico
          nova_client:
            api_version: 2.15
        /etc/manila/manila.conf:
          generic:
            connect_share_server_to_tenant_network: true
            driver_handles_share_servers: true
    devstack_localrc:
      ADMIN_PASSWORD: secretadmin
      DATABASE_PASSWORD: secretdatabase
      DEBUG_LIBVIRT_COREDUMPS: true
      DISABLE_AMP_IMAGE_BUILD: true
      ENABLE_SYSCTL_MEM_TUNING: true
      ENABLE_SYSCTL_NET_TUNING: true
      ENABLE_ZSWAP: true
      ERROR_ON_CLONE: true
      FIXED_RANGE: 10.1.0.0/20
      FLOATING_RANGE: 172.24.5.0/24
      GIT_BASE: https://github.com
      HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
      LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
      LOGFILE: /opt/stack/logs/devstacklog.txt
      LOG_COLOR: false
      MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
      MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
      MANILA_ENABLED_BACKENDS: generic
      MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
      NETWORK_GATEWAY: 10.1.0.1
      NOVA_LIBVIRT_TB_CACHE_SIZE: 128
      NOVA_VNC_ENABLED: true
      OCTAVIA_NODE: api
      OVN_DBS_LOG_LEVEL: dbg
      PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
      PUBLIC_NETWORK_GATEWAY: 172.24.5.1
      RABBIT_PASSWORD: secretrabbit
      SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      SERVICE_PASSWORD: secretservice
      SWIFT_HASH: 1234123412341234
      SWIFT_REPLICAS: 1
      SWIFT_START_ALL_SERVICES: false
      VERBOSE: true
      VERBOSE_NO_TIMESTAMP: true
    devstack_plugins:
      barbican: https://github.com/openstack/barbican
      magnum: https://review.opendev.org/openstack/magnum
      magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
      manila: https://github.com/openstack/manila
      octavia: https://github.com/openstack/octavia
      ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
    devstack_services:
      base: false
      c-api: true
      c-bak: true
      c-sch: true
      c-vol: true
      dstat: false
      etcd3: true
      file_tracker: true
      g-api: true
      horizon: false
      key: true
      memory_tracker: true
      mysql: true
      n-api: true
      n-api-meta: true
      n-cond: true
      n-cpu: true
      n-novnc: true
      n-sch: true
      o-api: true
      o-da: true
      o-hk: true
      octavia: true
      openstack-cli-server: true
      ovn-controller: true
      ovn-northd: true
      ovs-vswitchd: true
      ovsdb-server: true
      placement-api: true
      q-ovn-agent: true
      q-svc: true
      rabbit: true
      s-account: false
      s-container: false
      s-object: false
      s-proxy: false
      tempest: false
      tls-proxy: true
    extensions_to_txt:
      auto: true
      conf: true
      localrc: true
      log: true
      stackenv: true
    image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
      kube_tag }}.qcow2
    kube_tag: v1.32.12
    network_driver: calico
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job openstack-multinode-fips explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#17>'
      - '<Job devstack-base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#426>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#558>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#601>'
      - '<Job magnum-cluster-api-devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-hydrophone explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#60>'
      - '<Job magnum-cluster-api-hydrophone-v1.32.12 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#72>'
      - '<Job magnum-cluster-api-hydrophone-v1.32.12-calico explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#78>'
      - '<Job magnum-cluster-api-hydrophone-v1.32.12-calico explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 84e240b439b34fc7adc9420cb50a19d3
      build_refs:
      - branch: main
        change: '702'
        change_message: "fix(deps): update rust crate kube to v3\n\nThis PR contains
          the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n|
          [kube](https://redirect.github.com/kube-rs/kube) | dependencies | major
          | `1.0.0` \u2192 `3.0.0` |\n\n---\n\n### Release Notes\n\n<details>\n<summary>kube-rs/kube
          (kube)</summary>\n\n### [`v3.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#301--2026-01-30)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/3.0.0...3.0.1)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.1
          -->\n\n#### What's Changed\n\nBugfix release for schemas, admission, and
          docs. Minor internal improvements listed in the [milestone](https://redirect.github.com/kube-rs/kube/milestone/53?closed=1).
          Important fixes below.\n\n##### Fixed\n\n- Update API version of [`AdmissionResponse`](https://docs.rs/kube/3.0.1/kube/core/admission/struct.AdmissionResponse.html)
          created via invalid call by [@&#8203;Magicloud](https://redirect.github.com/Magicloud)
          in [#&#8203;1905](https://redirect.github.com/kube-rs/kube/pull/1905)\n-
          Fix [`OptionalEnum`](https://docs.rs/kube/3.0.1/kube/core/schema/struct.OptionalEnum.html)
          transform skipping schemas with description by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1908](https://redirect.github.com/kube-rs/kube/pull/1908)\n-
          Remove conflicting `additionalProperties: false` from schema by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1920](https://redirect.github.com/kube-rs/kube/pull/1920)\n\n###
          [`v3.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/2.0.1...3.0.0)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.0
          -->\n\n#### New Major\n\nAs per the new release schedule to match up with
          the new Kubernetes release.\nLots of additions, fixes and improvements.
          Thanks to everyone who contributed so heavily over the holidays! Happy new
          year.\n\n#### Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi
          [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
          [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
          conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
          kube has also swapped out `chrono`. The biggest impact of this is for interacting
          with timestamps in `metadata`, but it also updates 2 smaller public interfaces
          in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
          [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
          \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
          for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
          + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
          `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
          served as a partial metav1/Status replacement which ended up hiding error
          information to users. These structs have merged, more information is available
          on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
          which will be removed in a later version.\n\nThis creates a small breaking
          change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
          codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
          { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-
          \       }\n+        kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
          \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
          + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
          Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
          particularly affecting ones watching quickly rotating objects with generated
          names (e.g. pods). By default the TTL is `1h`. It can be configured via
          new [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
          parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
          \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
          in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
          helped expose and fix a bug in watches with streaming\\_lists now fixed
          in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
          Subresource Api\n\nSome subresource write methods were public with inconsistent
          signatures that required less ergonomic use than any other write methods.
          They took a `Vec<u8>` for the post body, now they take a `&K: Serialize`
          or the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
          [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
          `Api::replace_scale`. In essence this generally means you do not have to
          wrap raw objects in `json!` and `serde_json::to_vec` for these calls and
          lean more on rust's typed objects rather than `json!` blobs which has some
          [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
          for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\",
          &pp, serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
          &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
          [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
          Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
          up api discovery **significantly** by using the newer api with much less
          round-tripping.\nTo opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
          [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
          + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like
          to highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
          implementors which had to deal with a lot of options;\n\n```diff\n    pub
          fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
          {\n-            if let Some(job) = &obj {\n-                if let Some(s)
          = &job.status {\n-                    if let Some(conds) = &s.conditions
          {\n-                        if let Some(pcond) = conds.iter().find(|c| c.type_
          == \"Complete\") {\n-                            return pcond.status ==
          \"True\";\n-                        }\n-                    }\n-                }\n+
          \           if let Some(job) = &obj\n+                && let Some(s) = &job.status\n+
          \               && let Some(conds) = &s.conditions\n+                &&
          let Some(pcond) = conds.iter().find(|c| c.type_ == \"Complete\")\n+            {\n+
          \               return pcond.status == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
          + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
          New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
          opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
          retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
          for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
          See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
          example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
          + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
          based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
          Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
          schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
          What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by
          [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu) in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          feat: add #\\[kube(attr=\"...\")] attribute helper to set attribute helper
          on the CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n-
          Adds a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
          by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n-
          Implement aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n-
          Permit older version of API for v2 discovery for k8s < 1.30 (down to 1.27)
          by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n-
          Add RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
          Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0
          by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in
          [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n- Predicates:
          add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n-
          Update darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
          in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n-
          update to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
          in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n-
          Replace `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n-
          Merge ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
          in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n-
          Make subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n-
          Drop k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n-
          Add a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
          in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n-
          Bump `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
          Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024
          by [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
          Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          Distinguish between initial and resumed watch phases for streaming lists
          by [@&#8203;doxxx93](https://redirect.github.com/doxxx93) in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          Re-export deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n-
          Add nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n-
          send websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
          in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n-
          Fix watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n###
          [`v2.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#201--2025-09-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/2.0.0...2.0.1)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 2.0.1
          -->\n\n#### What's Changed\n\nFixes an accidental inclusion of a constraint
          added to `Api::log_stream` introduced in the 2.0.0 Rust 2024 upgrade.\n\n#####
          Fixed\n\n- Remove unused use<'\\_> from log\\_stream() by [@&#8203;pgerber](https://redirect.github.com/pgerber)
          in [#&#8203;1824](https://redirect.github.com/kube-rs/kube/pull/1824)\n\n###
          [`v2.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/1.1.0...2.0.0)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.0
          -->\n\n#### New Major\n\nAs per the new release schedule to match up with
          the new Kubernetes release.\nLots of additions, fixes and improvements.
          Thanks to everyone who contributed so heavily over the holidays! Happy new
          year.\n\n#### Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi
          [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
          [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
          conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
          kube has also swapped out `chrono`. The biggest impact of this is for interacting
          with timestamps in `metadata`, but it also updates 2 smaller public interfaces
          in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
          [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
          \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
          for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
          + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
          `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
          served as a partial metav1/Status replacement which ended up hiding error
          information to users. These structs have merged, more information is available
          on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
          which will be removed in a later version.\n\nThis creates a small breaking
          change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
          codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
          { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-
          \       }\n+        kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
          \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
          + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
          Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
          particularly affecting ones watching quickly rotating objects with generated
          names (e.g. pods). By default the TTL is `1h`. It can be configured via
          new [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
          parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
          \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
          in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
          helped expose and fix a bug in watches with streaming\\_lists now fixed
          in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
          Subresource Api\n\nSome subresource write methods were public with inconsistent
          signatures that required less ergonomic use than any other write methods.
          They took a `Vec<u8>` for the post body, now they take a `&K: Serialize`
          or the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
          [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
          `Api::replace_scale`. In essence this generally means you do not have to
          wrap raw objects in `json!` and `serde_json::to_vec` for these calls and
          lean more on rust's typed objects rather than `json!` blobs which has some
          [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
          for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\",
          &pp, serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
          &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
          [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
          Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
          up api discovery **significantly** by using the newer api with much less
          round-tripping.\nTo opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
          [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
          + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like
          to highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
          implementors which had to deal with a lot of options;\n\n```diff\n    pub
          fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
          {\n-            if let Some(job) = &obj {\n-                if let Some(s)
          = &job.status {\n-                    if let Some(conds) = &s.conditions
          {\n-                        if let Some(pcond) = conds.iter().find(|c| c.type_
          == \"Complete\") {\n-                            return pcond.status ==
          \"True\";\n-                        }\n-                    }\n-                }\n+
          \           if let Some(job) = &obj\n+                && let Some(s) = &job.status\n+
          \               && let Some(conds) = &s.conditions\n+                &&
          let Some(pcond) = conds.iter().find(|c| c.type_ == \"Complete\")\n+            {\n+
          \               return pcond.status == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
          + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
          New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
          opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
          retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
          for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
          See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
          example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
          + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
          based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
          Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
          schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
          What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by
          [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu) in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          feat: add #\\[kube(attr=\"...\")] attribute helper to set attribute helper
          on the CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n-
          Adds a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
          by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n-
          Implement aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n-
          Permit older version of API for v2 discovery for k8s < 1.30 (down to 1.27)
          by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n-
          Add RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
          Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0
          by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in
          [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n- Predicates:
          add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n-
          Update darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
          in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n-
          update to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
          in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n-
          Replace `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n-
          Merge ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
          in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n-
          Make subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n-
          Drop k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n-
          Add a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
          in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n-
          Bump `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
          Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024
          by [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
          Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          Distinguish between initial and resumed watch phases for streaming lists
          by [@&#8203;doxxx93](https://redirect.github.com/doxxx93) in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          Re-export deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n-
          Add nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n-
          send websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
          in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n-
          Fix watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n</details>\n\n---\n\n###
          Configuration\n\n\U0001F4C5 **Schedule**: Branch creation - At any time
          (no schedule defined), Automerge - At any time (no schedule defined).\n\n\U0001F6A6
          **Automerge**: Disabled by config. Please merge this manually once you are
          satisfied.\n\n\u267B **Rebasing**: Whenever PR becomes conflicted, or you
          tick the rebase/retry checkbox.\n\n\U0001F515 **Ignore**: Close this PR
          and you won't be reminded about this update again.\n\n---\n\n - [ ] <!--
          rebase-check -->If you want to rebase/retry this PR, check this box\n\n---\n\nThis
          PR was generated by [Mend Renovate](https://mend.io/renovate/). View the
          [repository job log](https://developer.mend.io/github/vexxhost/magnum-cluster-api).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS45IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/702
        commit_id: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        patchset: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      buildset: 4bd8b3c9bc2d49fbb58ca66df338db30
      buildset_refs:
      - branch: main
        change: '702'
        change_message: "fix(deps): update rust crate kube to v3\n\nThis PR contains
          the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n|
          [kube](https://redirect.github.com/kube-rs/kube) | dependencies | major
          | `1.0.0` \u2192 `3.0.0` |\n\n---\n\n### Release Notes\n\n<details>\n<summary>kube-rs/kube
          (kube)</summary>\n\n### [`v3.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#301--2026-01-30)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/3.0.0...3.0.1)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.1
          -->\n\n#### What's Changed\n\nBugfix release for schemas, admission, and
          docs. Minor internal improvements listed in the [milestone](https://redirect.github.com/kube-rs/kube/milestone/53?closed=1).
          Important fixes below.\n\n##### Fixed\n\n- Update API version of [`AdmissionResponse`](https://docs.rs/kube/3.0.1/kube/core/admission/struct.AdmissionResponse.html)
          created via invalid call by [@&#8203;Magicloud](https://redirect.github.com/Magicloud)
          in [#&#8203;1905](https://redirect.github.com/kube-rs/kube/pull/1905)\n-
          Fix [`OptionalEnum`](https://docs.rs/kube/3.0.1/kube/core/schema/struct.OptionalEnum.html)
          transform skipping schemas with description by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1908](https://redirect.github.com/kube-rs/kube/pull/1908)\n-
          Remove conflicting `additionalProperties: false` from schema by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1920](https://redirect.github.com/kube-rs/kube/pull/1920)\n\n###
          [`v3.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/2.0.1...3.0.0)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.0
          -->\n\n#### New Major\n\nAs per the new release schedule to match up with
          the new Kubernetes release.\nLots of additions, fixes and improvements.
          Thanks to everyone who contributed so heavily over the holidays! Happy new
          year.\n\n#### Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi
          [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
          [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
          conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
          kube has also swapped out `chrono`. The biggest impact of this is for interacting
          with timestamps in `metadata`, but it also updates 2 smaller public interfaces
          in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
          [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
          \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
          for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
          + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
          `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
          served as a partial metav1/Status replacement which ended up hiding error
          information to users. These structs have merged, more information is available
          on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
          which will be removed in a later version.\n\nThis creates a small breaking
          change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
          codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
          { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-
          \       }\n+        kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
          \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
          + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
          Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
          particularly affecting ones watching quickly rotating objects with generated
          names (e.g. pods). By default the TTL is `1h`. It can be configured via
          new [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
          parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
          \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
          in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
          helped expose and fix a bug in watches with streaming\\_lists now fixed
          in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
          Subresource Api\n\nSome subresource write methods were public with inconsistent
          signatures that required less ergonomic use than any other write methods.
          They took a `Vec<u8>` for the post body, now they take a `&K: Serialize`
          or the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
          [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
          `Api::replace_scale`. In essence this generally means you do not have to
          wrap raw objects in `json!` and `serde_json::to_vec` for these calls and
          lean more on rust's typed objects rather than `json!` blobs which has some
          [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
          for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\",
          &pp, serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
          &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
          [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
          Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
          up api discovery **significantly** by using the newer api with much less
          round-tripping.\nTo opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
          [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
          + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like
          to highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
          implementors which had to deal with a lot of options;\n\n```diff\n    pub
          fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
          {\n-            if let Some(job) = &obj {\n-                if let Some(s)
          = &job.status {\n-                    if let Some(conds) = &s.conditions
          {\n-                        if let Some(pcond) = conds.iter().find(|c| c.type_
          == \"Complete\") {\n-                            return pcond.status ==
          \"True\";\n-                        }\n-                    }\n-                }\n+
          \           if let Some(job) = &obj\n+                && let Some(s) = &job.status\n+
          \               && let Some(conds) = &s.conditions\n+                &&
          let Some(pcond) = conds.iter().find(|c| c.type_ == \"Complete\")\n+            {\n+
          \               return pcond.status == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
          + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
          New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
          opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
          retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
          for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
          See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
          example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
          + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
          based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
          Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
          schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
          What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by
          [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu) in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          feat: add #\\[kube(attr=\"...\")] attribute helper to set attribute helper
          on the CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n-
          Adds a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
          by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n-
          Implement aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n-
          Permit older version of API for v2 discovery for k8s < 1.30 (down to 1.27)
          by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n-
          Add RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
          Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0
          by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in
          [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n- Predicates:
          add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n-
          Update darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
          in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n-
          update to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
          in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n-
          Replace `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n-
          Merge ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
          in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n-
          Make subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n-
          Drop k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n-
          Add a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
          in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n-
          Bump `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
          Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024
          by [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
          Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          Distinguish between initial and resumed watch phases for streaming lists
          by [@&#8203;doxxx93](https://redirect.github.com/doxxx93) in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          Re-export deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n-
          Add nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n-
          send websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
          in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n-
          Fix watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n###
          [`v2.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#201--2025-09-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/2.0.0...2.0.1)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 2.0.1
          -->\n\n#### What's Changed\n\nFixes an accidental inclusion of a constraint
          added to `Api::log_stream` introduced in the 2.0.0 Rust 2024 upgrade.\n\n#####
          Fixed\n\n- Remove unused use<'\\_> from log\\_stream() by [@&#8203;pgerber](https://redirect.github.com/pgerber)
          in [#&#8203;1824](https://redirect.github.com/kube-rs/kube/pull/1824)\n\n###
          [`v2.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/1.1.0...2.0.0)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.0
          -->\n\n#### New Major\n\nAs per the new release schedule to match up with
          the new Kubernetes release.\nLots of additions, fixes and improvements.
          Thanks to everyone who contributed so heavily over the holidays! Happy new
          year.\n\n#### Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi
          [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
          [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
          conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
          kube has also swapped out `chrono`. The biggest impact of this is for interacting
          with timestamps in `metadata`, but it also updates 2 smaller public interfaces
          in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
          [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
          \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
          for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
          + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
          `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
          served as a partial metav1/Status replacement which ended up hiding error
          information to users. These structs have merged, more information is available
          on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
          which will be removed in a later version.\n\nThis creates a small breaking
          change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
          codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
          { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-
          \       }\n+        kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
          \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
          + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
          Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
          particularly affecting ones watching quickly rotating objects with generated
          names (e.g. pods). By default the TTL is `1h`. It can be configured via
          new [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
          parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
          \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
          in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
          helped expose and fix a bug in watches with streaming\\_lists now fixed
          in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
          Subresource Api\n\nSome subresource write methods were public with inconsistent
          signatures that required less ergonomic use than any other write methods.
          They took a `Vec<u8>` for the post body, now they take a `&K: Serialize`
          or the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
          [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
          `Api::replace_scale`. In essence this generally means you do not have to
          wrap raw objects in `json!` and `serde_json::to_vec` for these calls and
          lean more on rust's typed objects rather than `json!` blobs which has some
          [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
          for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\",
          &pp, serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
          &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
          [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
          Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
          up api discovery **significantly** by using the newer api with much less
          round-tripping.\nTo opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
          [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
          + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like
          to highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
          implementors which had to deal with a lot of options;\n\n```diff\n    pub
          fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
          {\n-            if let Some(job) = &obj {\n-                if let Some(s)
          = &job.status {\n-                    if let Some(conds) = &s.conditions
          {\n-                        if let Some(pcond) = conds.iter().find(|c| c.type_
          == \"Complete\") {\n-                            return pcond.status ==
          \"True\";\n-                        }\n-                    }\n-                }\n+
          \           if let Some(job) = &obj\n+                && let Some(s) = &job.status\n+
          \               && let Some(conds) = &s.conditions\n+                &&
          let Some(pcond) = conds.iter().find(|c| c.type_ == \"Complete\")\n+            {\n+
          \               return pcond.status == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
          + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
          New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
          opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
          retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
          for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
          See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
          example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
          + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
          based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
          Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
          schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
          What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by
          [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu) in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          feat: add #\\[kube(attr=\"...\")] attribute helper to set attribute helper
          on the CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n-
          Adds a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
          by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n-
          Implement aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n-
          Permit older version of API for v2 discovery for k8s < 1.30 (down to 1.27)
          by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n-
          Add RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
          Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0
          by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in
          [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n- Predicates:
          add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n-
          Update darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
          in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n-
          update to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
          in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n-
          Replace `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n-
          Merge ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
          in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n-
          Make subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n-
          Drop k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n-
          Add a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
          in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n-
          Bump `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
          Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024
          by [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
          Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          Distinguish between initial and resumed watch phases for streaming lists
          by [@&#8203;doxxx93](https://redirect.github.com/doxxx93) in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          Re-export deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n-
          Add nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n-
          send websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
          in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n-
          Fix watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n</details>\n\n---\n\n###
          Configuration\n\n\U0001F4C5 **Schedule**: Branch creation - At any time
          (no schedule defined), Automerge - At any time (no schedule defined).\n\n\U0001F6A6
          **Automerge**: Disabled by config. Please merge this manually once you are
          satisfied.\n\n\u267B **Rebasing**: Whenever PR becomes conflicted, or you
          tick the rebase/retry checkbox.\n\n\U0001F515 **Ignore**: Close this PR
          and you won't be reminded about this update again.\n\n---\n\n - [ ] <!--
          rebase-check -->If you want to rebase/retry this PR, check this box\n\n---\n\nThis
          PR was generated by [Mend Renovate](https://mend.io/renovate/). View the
          [repository job log](https://developer.mend.io/github/vexxhost/magnum-cluster-api).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS45IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/702
        commit_id: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        patchset: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      change: '702'
      change_message: "fix(deps): update rust crate kube to v3\n\nThis PR contains
        the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n|
        [kube](https://redirect.github.com/kube-rs/kube) | dependencies | major |
        `1.0.0` \u2192 `3.0.0` |\n\n---\n\n### Release Notes\n\n<details>\n<summary>kube-rs/kube
        (kube)</summary>\n\n### [`v3.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#301--2026-01-30)\n\n[Compare
        Source](https://redirect.github.com/kube-rs/kube/compare/3.0.0...3.0.1)\n\n\\===================\n\n<!--
        Release notes generated using configuration in .github/release.yml at 3.0.1
        -->\n\n#### What's Changed\n\nBugfix release for schemas, admission, and docs.
        Minor internal improvements listed in the [milestone](https://redirect.github.com/kube-rs/kube/milestone/53?closed=1).
        Important fixes below.\n\n##### Fixed\n\n- Update API version of [`AdmissionResponse`](https://docs.rs/kube/3.0.1/kube/core/admission/struct.AdmissionResponse.html)
        created via invalid call by [@&#8203;Magicloud](https://redirect.github.com/Magicloud)
        in [#&#8203;1905](https://redirect.github.com/kube-rs/kube/pull/1905)\n- Fix
        [`OptionalEnum`](https://docs.rs/kube/3.0.1/kube/core/schema/struct.OptionalEnum.html)
        transform skipping schemas with description by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1908](https://redirect.github.com/kube-rs/kube/pull/1908)\n- Remove
        conflicting `additionalProperties: false` from schema by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1920](https://redirect.github.com/kube-rs/kube/pull/1920)\n\n###
        [`v3.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
        Source](https://redirect.github.com/kube-rs/kube/compare/2.0.1...3.0.0)\n\n\\===================\n\n<!--
        Release notes generated using configuration in .github/release.yml at 3.0.0
        -->\n\n#### New Major\n\nAs per the new release schedule to match up with
        the new Kubernetes release.\nLots of additions, fixes and improvements. Thanks
        to everyone who contributed so heavily over the holidays! Happy new year.\n\n####
        Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
        [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
        conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
        kube has also swapped out `chrono`. The biggest impact of this is for interacting
        with timestamps in `metadata`, but it also updates 2 smaller public interfaces
        in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
        [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
        \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
        for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
        + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
        `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
        served as a partial metav1/Status replacement which ended up hiding error
        information to users. These structs have merged, more information is available
        on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
        which will be removed in a later version.\n\nThis creates a small breaking
        change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
        codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
        { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-        }\n+
        \       kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
        \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
        + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
        Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
        particularly affecting ones watching quickly rotating objects with generated
        names (e.g. pods). By default the TTL is `1h`. It can be configured via new
        [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
        parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
        \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
        in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
        helped expose and fix a bug in watches with streaming\\_lists now fixed in
        [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
        Subresource Api\n\nSome subresource write methods were public with inconsistent
        signatures that required less ergonomic use than any other write methods.
        They took a `Vec<u8>` for the post body, now they take a `&K: Serialize` or
        the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
        [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
        `Api::replace_scale`. In essence this generally means you do not have to wrap
        raw objects in `json!` and `serde_json::to_vec` for these calls and lean more
        on rust's typed objects rather than `json!` blobs which has some [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
        for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\", &pp,
        serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
        &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
        [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
        Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
        up api discovery **significantly** by using the newer api with much less round-tripping.\nTo
        opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
        [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
        + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
        Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like to
        highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
        implementors which had to deal with a lot of options;\n\n```diff\n    pub
        fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
        {\n-            if let Some(job) = &obj {\n-                if let Some(s)
        = &job.status {\n-                    if let Some(conds) = &s.conditions {\n-
        \                       if let Some(pcond) = conds.iter().find(|c| c.type_
        == \"Complete\") {\n-                            return pcond.status == \"True\";\n-
        \                       }\n-                    }\n-                }\n+            if
        let Some(job) = &obj\n+                && let Some(s) = &job.status\n+                &&
        let Some(conds) = &s.conditions\n+                && let Some(pcond) = conds.iter().find(|c|
        c.type_ == \"Complete\")\n+            {\n+                return pcond.status
        == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
        + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
        New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
        opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
        retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
        for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
        See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
        example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
        + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
        based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
        Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
        watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
        schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
        schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
        websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
        More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
        add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
        example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
        What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu)
        in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n- feat:
        add #\\[kube(attr=\"...\")] attribute helper to set attribute helper on the
        CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs) in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
        Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
        in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n- Adds
        a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
        by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
        Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n- Implement
        aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n- Permit
        older version of API for v2 discovery for k8s < 1.30 (down to 1.27) by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
        in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n- Add
        RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
        Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0 by
        [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n-
        Predicates: add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n- Update
        darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
        in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n- update
        to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
        in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n- Replace
        `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
        in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n- Merge
        ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
        in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n- Make
        subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n- Drop
        k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
        in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n- Add
        a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
        in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n- Bump
        `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
        in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
        Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024 by
        [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
        Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
        in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n- Distinguish
        between initial and resumed watch phases for streaming lists by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n- Re-export
        deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
        in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n- Add
        nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n- send
        websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
        in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n- Fix
        watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n###
        [`v2.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#201--2025-09-12)\n\n[Compare
        Source](https://redirect.github.com/kube-rs/kube/compare/2.0.0...2.0.1)\n\n\\===================\n\n<!--
        Release notes generated using configuration in .github/release.yml at 2.0.1
        -->\n\n#### What's Changed\n\nFixes an accidental inclusion of a constraint
        added to `Api::log_stream` introduced in the 2.0.0 Rust 2024 upgrade.\n\n#####
        Fixed\n\n- Remove unused use<'\\_> from log\\_stream() by [@&#8203;pgerber](https://redirect.github.com/pgerber)
        in [#&#8203;1824](https://redirect.github.com/kube-rs/kube/pull/1824)\n\n###
        [`v2.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
        Source](https://redirect.github.com/kube-rs/kube/compare/1.1.0...2.0.0)\n\n\\===================\n\n<!--
        Release notes generated using configuration in .github/release.yml at 3.0.0
        -->\n\n#### New Major\n\nAs per the new release schedule to match up with
        the new Kubernetes release.\nLots of additions, fixes and improvements. Thanks
        to everyone who contributed so heavily over the holidays! Happy new year.\n\n####
        Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
        [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
        conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
        kube has also swapped out `chrono`. The biggest impact of this is for interacting
        with timestamps in `metadata`, but it also updates 2 smaller public interfaces
        in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
        [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
        \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
        for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
        + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
        `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
        served as a partial metav1/Status replacement which ended up hiding error
        information to users. These structs have merged, more information is available
        on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
        which will be removed in a later version.\n\nThis creates a small breaking
        change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
        codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
        { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-        }\n+
        \       kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
        \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
        + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
        Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
        particularly affecting ones watching quickly rotating objects with generated
        names (e.g. pods). By default the TTL is `1h`. It can be configured via new
        [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
        parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
        \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
        in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
        helped expose and fix a bug in watches with streaming\\_lists now fixed in
        [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
        Subresource Api\n\nSome subresource write methods were public with inconsistent
        signatures that required less ergonomic use than any other write methods.
        They took a `Vec<u8>` for the post body, now they take a `&K: Serialize` or
        the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
        [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
        `Api::replace_scale`. In essence this generally means you do not have to wrap
        raw objects in `json!` and `serde_json::to_vec` for these calls and lean more
        on rust's typed objects rather than `json!` blobs which has some [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
        for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\", &pp,
        serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
        &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
        [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
        Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
        up api discovery **significantly** by using the newer api with much less round-tripping.\nTo
        opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
        [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
        + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
        Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like to
        highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
        implementors which had to deal with a lot of options;\n\n```diff\n    pub
        fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
        {\n-            if let Some(job) = &obj {\n-                if let Some(s)
        = &job.status {\n-                    if let Some(conds) = &s.conditions {\n-
        \                       if let Some(pcond) = conds.iter().find(|c| c.type_
        == \"Complete\") {\n-                            return pcond.status == \"True\";\n-
        \                       }\n-                    }\n-                }\n+            if
        let Some(job) = &obj\n+                && let Some(s) = &job.status\n+                &&
        let Some(conds) = &s.conditions\n+                && let Some(pcond) = conds.iter().find(|c|
        c.type_ == \"Complete\")\n+            {\n+                return pcond.status
        == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
        + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
        New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
        opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
        retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
        for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
        See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
        example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
        + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
        based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
        Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
        watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
        schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
        schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
        websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
        More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
        add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
        example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
        What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu)
        in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n- feat:
        add #\\[kube(attr=\"...\")] attribute helper to set attribute helper on the
        CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs) in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
        Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
        in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n- Adds
        a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
        by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
        Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n- Implement
        aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n- Permit
        older version of API for v2 discovery for k8s < 1.30 (down to 1.27) by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
        in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n- Add
        RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
        Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0 by
        [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n-
        Predicates: add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n- Update
        darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
        in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n- update
        to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
        in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n- Replace
        `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
        in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n- Merge
        ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
        in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n- Make
        subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n- Drop
        k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
        in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n- Add
        a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
        in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n- Bump
        `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
        in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
        Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024 by
        [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
        Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
        in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n- Distinguish
        between initial and resumed watch phases for streaming lists by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n- Re-export
        deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
        in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n- Add
        nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n- send
        websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
        in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n- Fix
        watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
        in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n</details>\n\n---\n\n###
        Configuration\n\n\U0001F4C5 **Schedule**: Branch creation - At any time (no
        schedule defined), Automerge - At any time (no schedule defined).\n\n\U0001F6A6
        **Automerge**: Disabled by config. Please merge this manually once you are
        satisfied.\n\n\u267B **Rebasing**: Whenever PR becomes conflicted, or you
        tick the rebase/retry checkbox.\n\n\U0001F515 **Ignore**: Close this PR and
        you won't be reminded about this update again.\n\n---\n\n - [ ] <!-- rebase-check
        -->If you want to rebase/retry this PR, check this box\n\n---\n\nThis PR was
        generated by [Mend Renovate](https://mend.io/renovate/). View the [repository
        job log](https://developer.mend.io/github/vexxhost/magnum-cluster-api).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS45IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/702
      child_jobs: []
      commit_id: f460b032bbb082b3cdc5e95b900385d6c48c12ea
      event_id: 08b28d70-1ed6-11f1-8444-7834a87eae8b
      executor:
        hostname: 0a8996d2b663
        inventory_file: /var/lib/zuul/builds/84e240b439b34fc7adc9420cb50a19d3/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/84e240b439b34fc7adc9420cb50a19d3/work/logs
        result_data_file: /var/lib/zuul/builds/84e240b439b34fc7adc9420cb50a19d3/work/results.json
        src_root: /var/lib/zuul/builds/84e240b439b34fc7adc9420cb50a19d3/work/src
        work_root: /var/lib/zuul/builds/84e240b439b34fc7adc9420cb50a19d3/work
      include_vars: []
      items:
      - branch: main
        change: '702'
        change_message: "fix(deps): update rust crate kube to v3\n\nThis PR contains
          the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n|
          [kube](https://redirect.github.com/kube-rs/kube) | dependencies | major
          | `1.0.0` \u2192 `3.0.0` |\n\n---\n\n### Release Notes\n\n<details>\n<summary>kube-rs/kube
          (kube)</summary>\n\n### [`v3.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#301--2026-01-30)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/3.0.0...3.0.1)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.1
          -->\n\n#### What's Changed\n\nBugfix release for schemas, admission, and
          docs. Minor internal improvements listed in the [milestone](https://redirect.github.com/kube-rs/kube/milestone/53?closed=1).
          Important fixes below.\n\n##### Fixed\n\n- Update API version of [`AdmissionResponse`](https://docs.rs/kube/3.0.1/kube/core/admission/struct.AdmissionResponse.html)
          created via invalid call by [@&#8203;Magicloud](https://redirect.github.com/Magicloud)
          in [#&#8203;1905](https://redirect.github.com/kube-rs/kube/pull/1905)\n-
          Fix [`OptionalEnum`](https://docs.rs/kube/3.0.1/kube/core/schema/struct.OptionalEnum.html)
          transform skipping schemas with description by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1908](https://redirect.github.com/kube-rs/kube/pull/1908)\n-
          Remove conflicting `additionalProperties: false` from schema by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1920](https://redirect.github.com/kube-rs/kube/pull/1920)\n\n###
          [`v3.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/2.0.1...3.0.0)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.0
          -->\n\n#### New Major\n\nAs per the new release schedule to match up with
          the new Kubernetes release.\nLots of additions, fixes and improvements.
          Thanks to everyone who contributed so heavily over the holidays! Happy new
          year.\n\n#### Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi
          [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
          [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
          conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
          kube has also swapped out `chrono`. The biggest impact of this is for interacting
          with timestamps in `metadata`, but it also updates 2 smaller public interfaces
          in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
          [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
          \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
          for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
          + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
          `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
          served as a partial metav1/Status replacement which ended up hiding error
          information to users. These structs have merged, more information is available
          on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
          which will be removed in a later version.\n\nThis creates a small breaking
          change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
          codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
          { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-
          \       }\n+        kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
          \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
          + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
          Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
          particularly affecting ones watching quickly rotating objects with generated
          names (e.g. pods). By default the TTL is `1h`. It can be configured via
          new [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
          parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
          \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
          in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
          helped expose and fix a bug in watches with streaming\\_lists now fixed
          in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
          Subresource Api\n\nSome subresource write methods were public with inconsistent
          signatures that required less ergonomic use than any other write methods.
          They took a `Vec<u8>` for the post body, now they take a `&K: Serialize`
          or the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
          [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
          `Api::replace_scale`. In essence this generally means you do not have to
          wrap raw objects in `json!` and `serde_json::to_vec` for these calls and
          lean more on rust's typed objects rather than `json!` blobs which has some
          [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
          for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\",
          &pp, serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
          &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
          [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
          Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
          up api discovery **significantly** by using the newer api with much less
          round-tripping.\nTo opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
          [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
          + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like
          to highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
          implementors which had to deal with a lot of options;\n\n```diff\n    pub
          fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
          {\n-            if let Some(job) = &obj {\n-                if let Some(s)
          = &job.status {\n-                    if let Some(conds) = &s.conditions
          {\n-                        if let Some(pcond) = conds.iter().find(|c| c.type_
          == \"Complete\") {\n-                            return pcond.status ==
          \"True\";\n-                        }\n-                    }\n-                }\n+
          \           if let Some(job) = &obj\n+                && let Some(s) = &job.status\n+
          \               && let Some(conds) = &s.conditions\n+                &&
          let Some(pcond) = conds.iter().find(|c| c.type_ == \"Complete\")\n+            {\n+
          \               return pcond.status == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
          + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
          New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
          opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
          retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
          for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
          See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
          example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
          + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
          based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
          Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
          schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
          What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by
          [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu) in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          feat: add #\\[kube(attr=\"...\")] attribute helper to set attribute helper
          on the CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n-
          Adds a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
          by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n-
          Implement aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n-
          Permit older version of API for v2 discovery for k8s < 1.30 (down to 1.27)
          by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n-
          Add RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
          Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0
          by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in
          [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n- Predicates:
          add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n-
          Update darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
          in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n-
          update to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
          in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n-
          Replace `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n-
          Merge ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
          in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n-
          Make subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n-
          Drop k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n-
          Add a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
          in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n-
          Bump `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
          Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024
          by [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
          Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          Distinguish between initial and resumed watch phases for streaming lists
          by [@&#8203;doxxx93](https://redirect.github.com/doxxx93) in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          Re-export deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n-
          Add nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n-
          send websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
          in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n-
          Fix watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n###
          [`v2.0.1`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#201--2025-09-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/2.0.0...2.0.1)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 2.0.1
          -->\n\n#### What's Changed\n\nFixes an accidental inclusion of a constraint
          added to `Api::log_stream` introduced in the 2.0.0 Rust 2024 upgrade.\n\n#####
          Fixed\n\n- Remove unused use<'\\_> from log\\_stream() by [@&#8203;pgerber](https://redirect.github.com/pgerber)
          in [#&#8203;1824](https://redirect.github.com/kube-rs/kube/pull/1824)\n\n###
          [`v2.0.0`](https://redirect.github.com/kube-rs/kube/blob/HEAD/CHANGELOG.md#300--2026-01-12)\n\n[Compare
          Source](https://redirect.github.com/kube-rs/kube/compare/1.1.0...2.0.0)\n\n\\===================\n\n<!--
          Release notes generated using configuration in .github/release.yml at 3.0.0
          -->\n\n#### New Major\n\nAs per the new release schedule to match up with
          the new Kubernetes release.\nLots of additions, fixes and improvements.
          Thanks to everyone who contributed so heavily over the holidays! Happy new
          year.\n\n#### Breaking Changes\n\n##### Kubernetes `v1_35` support via k8s-openapi
          [0.27](https://redirect.github.com/Arnavion/k8s-openapi/releases/tag/v0.27.0)\n\nPlease
          [upgrade k8s-openapi along with kube](https://kube.rs/upgrading/) to avoid
          conflicts.\n\n##### `jiff` replaces `chrono`\n\nMatching k8s-openapi's [change](https://redirect.github.com/Arnavion/k8s-openapi/commit/8c1b6fccb7258eb487ed8c829791d427a4b16216),
          kube has also swapped out `chrono`. The biggest impact of this is for interacting
          with timestamps in `metadata`, but it also updates 2 smaller public interfaces
          in [`LogParams`](https://docs.rs/kube/latest/kube/api/struct.LogParams.html#structfield.since_time),
          [`Client::with_valid_until`](https://docs.rs/kube/latest/kube/struct.Client.html#method.with_valid_until).
          \ See [controller-rs#217](https://redirect.github.com/kube-rs/controller-rs/pull/217/changes)
          for an example change.\n\nChanges: [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)
          + [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n\n####
          `ErrorResponse` has been replaced with [`Status`](https://docs.rs/kube/latest/kube/core/struct.Status.html)\n\n`ErrorResponse`
          served as a partial metav1/Status replacement which ended up hiding error
          information to users. These structs have merged, more information is available
          on errors, and a type alias with a deprecation warning is in place for [`ErrorResponse`](https://docs.rs/kube/latest/kube/core/type.ErrorResponse.html)
          which will be removed in a later version.\n\nThis creates a small breaking
          change for users matching on specific [`Error::Api`](https://docs.rs/kube/latest/kube/enum.Error.html#variant.Api)
          codes;\n\n```diff\n     .map_err(|error| match error {\n-        kube::Error::Api(kube::error::ErrorResponse
          { code: 403, .. }) => {\n-            Error::UnauthorizedToPatch(obj)\n-
          \       }\n+        kube::Error::Api(s) if s.is_forbidden() => Error::UnauthorizedToPatch(obj),\n
          \        other => Error::Other(other),\n     })?;\n```\n\n[#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)
          + [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883) + [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891).\n\n####
          Predicates now has a TTL Cache\n\nThis prevents unbounded memory for controllers,
          particularly affecting ones watching quickly rotating objects with generated
          names (e.g. pods). By default the TTL is `1h`. It can be configured via
          new [`PredicateConfig`](https://docs.rs/kube/latest/kube/runtime/struct.PredicateConfig.html)
          parameter. To use the default;\n\n```diff\n-        .predicate_filter(predicates::resource_version);\n+
          \       .predicate_filter(predicates::resource_version, Default::default());\n```\n\nChange
          in [#&#8203;1836](https://redirect.github.com/kube-rs/kube/pull/1836). This
          helped expose and fix a bug in watches with streaming\\_lists now fixed
          in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882).\n\n####
          Subresource Api\n\nSome subresource write methods were public with inconsistent
          signatures that required less ergonomic use than any other write methods.
          They took a `Vec<u8>` for the post body, now they take a `&K: Serialize`
          or the actual subresource.\nThere affect `Api::create_subresource`, `Api::replace_subresource`,
          [`Api::replace_status`](https://docs.rs/kube/latest/kube/struct.Api.html#method.replace_status),
          `Api::replace_scale`. In essence this generally means you do not have to
          wrap raw objects in `json!` and `serde_json::to_vec` for these calls and
          lean more on rust's typed objects rather than `json!` blobs which has some
          [footguns](https://redirect.github.com/kube-rs/kube/pull/1884#discussion_r2680782556)
          for subresources.\n\n```diff\n-    let o = foos.replace_status(\"qux\",
          &pp, serde_json::to_vec(&object)?).await?;\n+    let o = foos.replace_status(\"qux\",
          &pp, &object).await?;\n```\n\nSee some more shifts in examples in the implementation;
          [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n\n####
          Improvements\n\n##### Support Kubernetes 1.30 [Aggregated Discovery](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#aggregated-discovery)\n\nSpeeds
          up api discovery **significantly** by using the newer api with much less
          round-tripping.\nTo opt-in change `Discovery::run()` to [`Discovery::run_aggregated()`](https://docs.rs/kube/latest/kube/struct.Discovery.html#method.run_aggregated)\n\nChanges;
          [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876) + [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)
          + [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          Rust 2024\n\nWhile this is mostly for internal ergonomics, we would like
          to highlight this also simplifies the [`Condition`](https://docs.rs/kube/latest/kube/runtime/wait/conditions/trait.Condition.html)
          implementors which had to deal with a lot of options;\n\n```diff\n    pub
          fn is_job_completed() -> impl Condition<Job> {\n        |obj: Option<&Job>|
          {\n-            if let Some(job) = &obj {\n-                if let Some(s)
          = &job.status {\n-                    if let Some(conds) = &s.conditions
          {\n-                        if let Some(pcond) = conds.iter().find(|c| c.type_
          == \"Complete\") {\n-                            return pcond.status ==
          \"True\";\n-                        }\n-                    }\n-                }\n+
          \           if let Some(job) = &obj\n+                && let Some(s) = &job.status\n+
          \               && let Some(conds) = &s.conditions\n+                &&
          let Some(pcond) = conds.iter().find(|c| c.type_ == \"Complete\")\n+            {\n+
          \               return pcond.status == \"True\";\n```\n\nChange [#&#8203;1856](https://redirect.github.com/kube-rs/kube/pull/1856)
          + [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n\n#####
          New Client [`RetryPolicy`](https://docs.rs/kube/latest/kube/client/retry/struct.RetryPolicy.html)
          opt-in\n\nAllows custom clients (for now) to enable exponential backoff'd
          retries for retryable errors by exposing a [`tower::retry::Policy`](https://tower-rs.github.io/tower/tower/retry/trait.Policy.html)
          for a [`tower::retry::Layer`](https://tower-rs.github.io/tower/tower/retry/struct.RetryLayer.html).
          See the new [custom\\_client\\_retry](https://redirect.github.com/kube-rs/kube/blob/main/examples/custom_client_retry.rs#L24-L37)
          example for details.\n\nEnabled by a [cloneable body](https://redirect.github.com/kube-rs/kube/pull/1867)
          + the new [RetryPolicy](https://redirect.github.com/kube-rs/kube/pull/1894)
          based on mirrord's solution[\\*](https://redirect.github.com/metalbear-co/mirrord/blob/a9e4c52a720fd5a833e30aee1ac650360031b7a7/mirrord/kube/src/retry.rs#L41-L135).\n\n####
          Fixes\n\n- streaming list bug fix - [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          watcher jitter bug fix - [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n-
          schema fix for IntOrString - [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          schema fix for optional enums - [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          websocket keepalives for long running attaches - [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n\n#####
          More\n\n- `Resize` subresource impl for `Pod` - [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          add `#[kube(attr=\"...\")` to allow custom attrs on derives - [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          example updates for admission w/axum - [#&#8203;1859](https://redirect.github.com/kube-rs/kube/pull/1859)\n\n####
          What's Changed\n\n##### Added\n\n- Add `Resize` subresource for `Pod` by
          [@&#8203;hugoponthieu](https://redirect.github.com/hugoponthieu) in [#&#8203;1851](https://redirect.github.com/kube-rs/kube/pull/1851)\n-
          feat: add #\\[kube(attr=\"...\")] attribute helper to set attribute helper
          on the CR root type by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1850](https://redirect.github.com/kube-rs/kube/pull/1850)\n-
          Rust 2024 let-chains to simplify wait Conditions by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1792](https://redirect.github.com/kube-rs/kube/pull/1792)\n-
          Adds a `try_clone` method for `kube_client::client::Body` when it's `Kind::Once`
          by [@&#8203;meowjesty](https://redirect.github.com/meowjesty) in [#&#8203;1867](https://redirect.github.com/kube-rs/kube/pull/1867)\n-
          Implement client aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1873](https://redirect.github.com/kube-rs/kube/pull/1873)\n-
          Implement aggregated discovery API methods by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1876](https://redirect.github.com/kube-rs/kube/pull/1876)\n-
          Permit older version of API for v2 discovery for k8s < 1.30 (down to 1.27)
          by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1889](https://redirect.github.com/kube-rs/kube/pull/1889)\n-
          Add RetryPolicy for client-level request retries by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1894](https://redirect.github.com/kube-rs/kube/pull/1894)\n\n#####
          Changed\n\n- Update tokio-tungstenite requirement from 0.27.0 to 0.28.0
          by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot] in
          [#&#8203;1829](https://redirect.github.com/kube-rs/kube/pull/1829)\n- Predicates:
          add configurable cache TTL for `predicate_filter` by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1838](https://redirect.github.com/kube-rs/kube/pull/1838)\n-
          Update darling requirement from 0.21.0 to 0.23.0 by [@&#8203;dependabot](https://redirect.github.com/dependabot)\\[bot]
          in [#&#8203;1861](https://redirect.github.com/kube-rs/kube/pull/1861)\n-
          update to jsonpath-rust 1 by [@&#8203;tottoto](https://redirect.github.com/tottoto)
          in [#&#8203;1863](https://redirect.github.com/kube-rs/kube/pull/1863)\n-
          Replace `chrono` with `jiff` by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1868](https://redirect.github.com/kube-rs/kube/pull/1868)\n-
          Merge ErrorResponse and Status by [@&#8203;imp](https://redirect.github.com/imp)
          in [#&#8203;1875](https://redirect.github.com/kube-rs/kube/pull/1875)\n-
          Make subresource methods more ergonomic by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1884](https://redirect.github.com/kube-rs/kube/pull/1884)\n-
          Drop k8s v1.30, crono->jiff replacement for runtime & examples by [@&#8203;ngergs](https://redirect.github.com/ngergs)
          in [#&#8203;1870](https://redirect.github.com/kube-rs/kube/pull/1870)\n-
          Add a metadata field to Status by [@&#8203;ryanpbrewster](https://redirect.github.com/ryanpbrewster)
          in [#&#8203;1891](https://redirect.github.com/kube-rs/kube/pull/1891)\n-
          Bump `k8s-openapi` for Kubernetes 1.35 by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1898](https://redirect.github.com/kube-rs/kube/pull/1898)\n\n#####
          Fixed\n\n- fix: add use<> to kubelet\\_node\\_logs for rust edition 2024
          by [@&#8203;co42](https://redirect.github.com/co42) in [#&#8203;1849](https://redirect.github.com/kube-rs/kube/pull/1849)\n-
          Transform optional enums to match pre kube 2.0.0 format by [@&#8203;Danil-Grigorev](https://redirect.github.com/Danil-Grigorev)
          in [#&#8203;1853](https://redirect.github.com/kube-rs/kube/pull/1853)\n-
          Distinguish between initial and resumed watch phases for streaming lists
          by [@&#8203;doxxx93](https://redirect.github.com/doxxx93) in [#&#8203;1882](https://redirect.github.com/kube-rs/kube/pull/1882)\n-
          Re-export deprecated type alias and improve deprecation guidance by [@&#8203;clux](https://redirect.github.com/clux)
          in [#&#8203;1883](https://redirect.github.com/kube-rs/kube/pull/1883)\n-
          Add nullable to optional fields with x-kubernetes-int-or-string by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1885](https://redirect.github.com/kube-rs/kube/pull/1885)\n-
          send websocket ping to keep idle connections alive by [@&#8203;inqode-lars](https://redirect.github.com/inqode-lars)
          in [#&#8203;1887](https://redirect.github.com/kube-rs/kube/pull/1887)\n-
          Fix watcher ExponentialBackoff jitter ignored by [@&#8203;doxxx93](https://redirect.github.com/doxxx93)
          in [#&#8203;1897](https://redirect.github.com/kube-rs/kube/pull/1897)\n\n</details>\n\n---\n\n###
          Configuration\n\n\U0001F4C5 **Schedule**: Branch creation - At any time
          (no schedule defined), Automerge - At any time (no schedule defined).\n\n\U0001F6A6
          **Automerge**: Disabled by config. Please merge this manually once you are
          satisfied.\n\n\u267B **Rebasing**: Whenever PR becomes conflicted, or you
          tick the rebase/retry checkbox.\n\n\U0001F515 **Ignore**: Close this PR
          and you won't be reminded about this update again.\n\n---\n\n - [ ] <!--
          rebase-check -->If you want to rebase/retry this PR, check this box\n\n---\n\nThis
          PR was generated by [Mend Renovate](https://mend.io/renovate/). View the
          [repository job log](https://developer.mend.io/github/vexxhost/magnum-cluster-api).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS45IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/702
        commit_id: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        patchset: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      job: magnum-cluster-api-hydrophone-v1.32.12-calico
      jobtags: []
      max_attempts: 3
      message: Zml4KGRlcHMpOiB1cGRhdGUgcnVzdCBjcmF0ZSBrdWJlIHRvIHYzCgpUaGlzIFBSIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdXBkYXRlczoKCnwgUGFja2FnZSB8IFR5cGUgfCBVcGRhdGUgfCBDaGFuZ2UgfAp8LS0tfC0tLXwtLS18LS0tfAp8IFtrdWJlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlKSB8IGRlcGVuZGVuY2llcyB8IG1ham9yIHwgYDEuMC4wYCDihpIgYDMuMC4wYCB8CgotLS0KCiMjIyBSZWxlYXNlIE5vdGVzCgo8ZGV0YWlscz4KPHN1bW1hcnk+a3ViZS1ycy9rdWJlIChrdWJlKTwvc3VtbWFyeT4KCiMjIyBbYHYzLjAuMWBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvYmxvYi9IRUFEL0NIQU5HRUxPRy5tZCMzMDEtLTIwMjYtMDEtMzApCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvY29tcGFyZS8zLjAuMC4uLjMuMC4xKQoKXD09PT09PT09PT09PT09PT09PT0KCjwhLS0gUmVsZWFzZSBub3RlcyBnZW5lcmF0ZWQgdXNpbmcgY29uZmlndXJhdGlvbiBpbiAuZ2l0aHViL3JlbGVhc2UueW1sIGF0IDMuMC4xIC0tPgoKIyMjIyBXaGF0J3MgQ2hhbmdlZAoKQnVnZml4IHJlbGVhc2UgZm9yIHNjaGVtYXMsIGFkbWlzc2lvbiwgYW5kIGRvY3MuIE1pbm9yIGludGVybmFsIGltcHJvdmVtZW50cyBsaXN0ZWQgaW4gdGhlIFttaWxlc3RvbmVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvbWlsZXN0b25lLzUzP2Nsb3NlZD0xKS4gSW1wb3J0YW50IGZpeGVzIGJlbG93LgoKIyMjIyMgRml4ZWQKCi0gVXBkYXRlIEFQSSB2ZXJzaW9uIG9mIFtgQWRtaXNzaW9uUmVzcG9uc2VgXShodHRwczovL2RvY3MucnMva3ViZS8zLjAuMS9rdWJlL2NvcmUvYWRtaXNzaW9uL3N0cnVjdC5BZG1pc3Npb25SZXNwb25zZS5odG1sKSBjcmVhdGVkIHZpYSBpbnZhbGlkIGNhbGwgYnkgW0AmIzgyMDM7TWFnaWNsb3VkXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vTWFnaWNsb3VkKSBpbiBbIyYjODIwMzsxOTA1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTkwNSkKLSBGaXggW2BPcHRpb25hbEVudW1gXShodHRwczovL2RvY3MucnMva3ViZS8zLjAuMS9rdWJlL2NvcmUvc2NoZW1hL3N0cnVjdC5PcHRpb25hbEVudW0uaHRtbCkgdHJhbnNmb3JtIHNraXBwaW5nIHNjaGVtYXMgd2l0aCBkZXNjcmlwdGlvbiBieSBbQCYjODIwMztkb3h4eDkzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG94eHg5MykgaW4gWyMmIzgyMDM7MTkwOF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE5MDgpCi0gUmVtb3ZlIGNvbmZsaWN0aW5nIGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgIGZyb20gc2NoZW1hIGJ5IFtAJiM4MjAzO2RveHh4OTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kb3h4eDkzKSBpbiBbIyYjODIwMzsxOTIwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTkyMCkKCiMjIyBbYHYzLjAuMGBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvYmxvYi9IRUFEL0NIQU5HRUxPRy5tZCMzMDAtLTIwMjYtMDEtMTIpCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvY29tcGFyZS8yLjAuMS4uLjMuMC4wKQoKXD09PT09PT09PT09PT09PT09PT0KCjwhLS0gUmVsZWFzZSBub3RlcyBnZW5lcmF0ZWQgdXNpbmcgY29uZmlndXJhdGlvbiBpbiAuZ2l0aHViL3JlbGVhc2UueW1sIGF0IDMuMC4wIC0tPgoKIyMjIyBOZXcgTWFqb3IKCkFzIHBlciB0aGUgbmV3IHJlbGVhc2Ugc2NoZWR1bGUgdG8gbWF0Y2ggdXAgd2l0aCB0aGUgbmV3IEt1YmVybmV0ZXMgcmVsZWFzZS4KTG90cyBvZiBhZGRpdGlvbnMsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMuIFRoYW5rcyB0byBldmVyeW9uZSB3aG8gY29udHJpYnV0ZWQgc28gaGVhdmlseSBvdmVyIHRoZSBob2xpZGF5cyEgSGFwcHkgbmV3IHllYXIuCgojIyMjIEJyZWFraW5nIENoYW5nZXMKCiMjIyMjIEt1YmVybmV0ZXMgYHYxXzM1YCBzdXBwb3J0IHZpYSBrOHMtb3BlbmFwaSBbMC4yN10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL0FybmF2aW9uL2s4cy1vcGVuYXBpL3JlbGVhc2VzL3RhZy92MC4yNy4wKQoKUGxlYXNlIFt1cGdyYWRlIGs4cy1vcGVuYXBpIGFsb25nIHdpdGgga3ViZV0oaHR0cHM6Ly9rdWJlLnJzL3VwZ3JhZGluZy8pIHRvIGF2b2lkIGNvbmZsaWN0cy4KCiMjIyMjIGBqaWZmYCByZXBsYWNlcyBgY2hyb25vYAoKTWF0Y2hpbmcgazhzLW9wZW5hcGkncyBbY2hhbmdlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vQXJuYXZpb24vazhzLW9wZW5hcGkvY29tbWl0LzhjMWI2ZmNjYjcyNThlYjQ4N2VkOGM4Mjk3OTFkNDI3YTRiMTYyMTYpLCBrdWJlIGhhcyBhbHNvIHN3YXBwZWQgb3V0IGBjaHJvbm9gLiBUaGUgYmlnZ2VzdCBpbXBhY3Qgb2YgdGhpcyBpcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aW1lc3RhbXBzIGluIGBtZXRhZGF0YWAsIGJ1dCBpdCBhbHNvIHVwZGF0ZXMgMiBzbWFsbGVyIHB1YmxpYyBpbnRlcmZhY2VzIGluIFtgTG9nUGFyYW1zYF0oaHR0cHM6Ly9kb2NzLnJzL2t1YmUvbGF0ZXN0L2t1YmUvYXBpL3N0cnVjdC5Mb2dQYXJhbXMuaHRtbCNzdHJ1Y3RmaWVsZC5zaW5jZV90aW1lKSwgW2BDbGllbnQ6OndpdGhfdmFsaWRfdW50aWxgXShodHRwczovL2RvY3MucnMva3ViZS9sYXRlc3Qva3ViZS9zdHJ1Y3QuQ2xpZW50Lmh0bWwjbWV0aG9kLndpdGhfdmFsaWRfdW50aWwpLiAgU2VlIFtjb250cm9sbGVyLXJzIzIxN10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMvY29udHJvbGxlci1ycy9wdWxsLzIxNy9jaGFuZ2VzKSBmb3IgYW4gZXhhbXBsZSBjaGFuZ2UuCgpDaGFuZ2VzOiBbIyYjODIwMzsxODY4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg2OCkgKyBbIyYjODIwMzsxODcwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3MCkKCiMjIyMgYEVycm9yUmVzcG9uc2VgIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggW2BTdGF0dXNgXShodHRwczovL2RvY3MucnMva3ViZS9sYXRlc3Qva3ViZS9jb3JlL3N0cnVjdC5TdGF0dXMuaHRtbCkKCmBFcnJvclJlc3BvbnNlYCBzZXJ2ZWQgYXMgYSBwYXJ0aWFsIG1ldGF2MS9TdGF0dXMgcmVwbGFjZW1lbnQgd2hpY2ggZW5kZWQgdXAgaGlkaW5nIGVycm9yIGluZm9ybWF0aW9uIHRvIHVzZXJzLiBUaGVzZSBzdHJ1Y3RzIGhhdmUgbWVyZ2VkLCBtb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBvbiBlcnJvcnMsIGFuZCBhIHR5cGUgYWxpYXMgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgaXMgaW4gcGxhY2UgZm9yIFtgRXJyb3JSZXNwb25zZWBdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL2NvcmUvdHlwZS5FcnJvclJlc3BvbnNlLmh0bWwpIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGxhdGVyIHZlcnNpb24uCgpUaGlzIGNyZWF0ZXMgYSBzbWFsbCBicmVha2luZyBjaGFuZ2UgZm9yIHVzZXJzIG1hdGNoaW5nIG9uIHNwZWNpZmljIFtgRXJyb3I6OkFwaWBdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL2VudW0uRXJyb3IuaHRtbCN2YXJpYW50LkFwaSkgY29kZXM7CgpgYGBkaWZmCiAgICAgLm1hcF9lcnIofGVycm9yfCBtYXRjaCBlcnJvciB7Ci0gICAgICAgIGt1YmU6OkVycm9yOjpBcGkoa3ViZTo6ZXJyb3I6OkVycm9yUmVzcG9uc2UgeyBjb2RlOiA0MDMsIC4uIH0pID0+IHsKLSAgICAgICAgICAgIEVycm9yOjpVbmF1dGhvcml6ZWRUb1BhdGNoKG9iaikKLSAgICAgICAgfQorICAgICAgICBrdWJlOjpFcnJvcjo6QXBpKHMpIGlmIHMuaXNfZm9yYmlkZGVuKCkgPT4gRXJyb3I6OlVuYXV0aG9yaXplZFRvUGF0Y2gob2JqKSwKICAgICAgICAgb3RoZXIgPT4gRXJyb3I6Ok90aGVyKG90aGVyKSwKICAgICB9KT87CmBgYAoKWyMmIzgyMDM7MTg3NV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NzUpICsgWyMmIzgyMDM7MTg4M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODMpICsgWyMmIzgyMDM7MTg5MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4OTEpLgoKIyMjIyBQcmVkaWNhdGVzIG5vdyBoYXMgYSBUVEwgQ2FjaGUKClRoaXMgcHJldmVudHMgdW5ib3VuZGVkIG1lbW9yeSBmb3IgY29udHJvbGxlcnMsIHBhcnRpY3VsYXJseSBhZmZlY3Rpbmcgb25lcyB3YXRjaGluZyBxdWlja2x5IHJvdGF0aW5nIG9iamVjdHMgd2l0aCBnZW5lcmF0ZWQgbmFtZXMgKGUuZy4gcG9kcykuIEJ5IGRlZmF1bHQgdGhlIFRUTCBpcyBgMWhgLiBJdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgbmV3IFtgUHJlZGljYXRlQ29uZmlnYF0oaHR0cHM6Ly9kb2NzLnJzL2t1YmUvbGF0ZXN0L2t1YmUvcnVudGltZS9zdHJ1Y3QuUHJlZGljYXRlQ29uZmlnLmh0bWwpIHBhcmFtZXRlci4gVG8gdXNlIHRoZSBkZWZhdWx0OwoKYGBgZGlmZgotICAgICAgICAucHJlZGljYXRlX2ZpbHRlcihwcmVkaWNhdGVzOjpyZXNvdXJjZV92ZXJzaW9uKTsKKyAgICAgICAgLnByZWRpY2F0ZV9maWx0ZXIocHJlZGljYXRlczo6cmVzb3VyY2VfdmVyc2lvbiwgRGVmYXVsdDo6ZGVmYXVsdCgpKTsKYGBgCgpDaGFuZ2UgaW4gWyMmIzgyMDM7MTgzNl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4MzYpLiBUaGlzIGhlbHBlZCBleHBvc2UgYW5kIGZpeCBhIGJ1ZyBpbiB3YXRjaGVzIHdpdGggc3RyZWFtaW5nXF9saXN0cyBub3cgZml4ZWQgaW4gWyMmIzgyMDM7MTg4Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODIpLgoKIyMjIyBTdWJyZXNvdXJjZSBBcGkKClNvbWUgc3VicmVzb3VyY2Ugd3JpdGUgbWV0aG9kcyB3ZXJlIHB1YmxpYyB3aXRoIGluY29uc2lzdGVudCBzaWduYXR1cmVzIHRoYXQgcmVxdWlyZWQgbGVzcyBlcmdvbm9taWMgdXNlIHRoYW4gYW55IG90aGVyIHdyaXRlIG1ldGhvZHMuIFRoZXkgdG9vayBhIGBWZWM8dTg+YCBmb3IgdGhlIHBvc3QgYm9keSwgbm93IHRoZXkgdGFrZSBhIGAmSzogU2VyaWFsaXplYCBvciB0aGUgYWN0dWFsIHN1YnJlc291cmNlLgpUaGVyZSBhZmZlY3QgYEFwaTo6Y3JlYXRlX3N1YnJlc291cmNlYCwgYEFwaTo6cmVwbGFjZV9zdWJyZXNvdXJjZWAsIFtgQXBpOjpyZXBsYWNlX3N0YXR1c2BdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL3N0cnVjdC5BcGkuaHRtbCNtZXRob2QucmVwbGFjZV9zdGF0dXMpLCBgQXBpOjpyZXBsYWNlX3NjYWxlYC4gSW4gZXNzZW5jZSB0aGlzIGdlbmVyYWxseSBtZWFucyB5b3UgZG8gbm90IGhhdmUgdG8gd3JhcCByYXcgb2JqZWN0cyBpbiBganNvbiFgIGFuZCBgc2VyZGVfanNvbjo6dG9fdmVjYCBmb3IgdGhlc2UgY2FsbHMgYW5kIGxlYW4gbW9yZSBvbiBydXN0J3MgdHlwZWQgb2JqZWN0cyByYXRoZXIgdGhhbiBganNvbiFgIGJsb2JzIHdoaWNoIGhhcyBzb21lIFtmb290Z3Vuc10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODQjZGlzY3Vzc2lvbl9yMjY4MDc4MjU1NikgZm9yIHN1YnJlc291cmNlcy4KCmBgYGRpZmYKLSAgICBsZXQgbyA9IGZvb3MucmVwbGFjZV9zdGF0dXMoInF1eCIsICZwcCwgc2VyZGVfanNvbjo6dG9fdmVjKCZvYmplY3QpPykuYXdhaXQ/OworICAgIGxldCBvID0gZm9vcy5yZXBsYWNlX3N0YXR1cygicXV4IiwgJnBwLCAmb2JqZWN0KS5hd2FpdD87CmBgYAoKU2VlIHNvbWUgbW9yZSBzaGlmdHMgaW4gZXhhbXBsZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uOyBbIyYjODIwMzsxODg0XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg4NCkKCiMjIyMgSW1wcm92ZW1lbnRzCgojIyMjIyBTdXBwb3J0IEt1YmVybmV0ZXMgMS4zMCBbQWdncmVnYXRlZCBEaXNjb3ZlcnldKGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L2t1YmVybmV0ZXMtYXBpLyNhZ2dyZWdhdGVkLWRpc2NvdmVyeSkKClNwZWVkcyB1cCBhcGkgZGlzY292ZXJ5ICoqc2lnbmlmaWNhbnRseSoqIGJ5IHVzaW5nIHRoZSBuZXdlciBhcGkgd2l0aCBtdWNoIGxlc3Mgcm91bmQtdHJpcHBpbmcuClRvIG9wdC1pbiBjaGFuZ2UgYERpc2NvdmVyeTo6cnVuKClgIHRvIFtgRGlzY292ZXJ5OjpydW5fYWdncmVnYXRlZCgpYF0oaHR0cHM6Ly9kb2NzLnJzL2t1YmUvbGF0ZXN0L2t1YmUvc3RydWN0LkRpc2NvdmVyeS5odG1sI21ldGhvZC5ydW5fYWdncmVnYXRlZCkKCkNoYW5nZXM7IFsjJiM4MjAzOzE4NzZdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODc2KSArIFsjJiM4MjAzOzE4NzNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODczKSArIFsjJiM4MjAzOzE4ODldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODg5KQoKIyMjIyMgUnVzdCAyMDI0CgpXaGlsZSB0aGlzIGlzIG1vc3RseSBmb3IgaW50ZXJuYWwgZXJnb25vbWljcywgd2Ugd291bGQgbGlrZSB0byBoaWdobGlnaHQgdGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIFtgQ29uZGl0aW9uYF0oaHR0cHM6Ly9kb2NzLnJzL2t1YmUvbGF0ZXN0L2t1YmUvcnVudGltZS93YWl0L2NvbmRpdGlvbnMvdHJhaXQuQ29uZGl0aW9uLmh0bWwpIGltcGxlbWVudG9ycyB3aGljaCBoYWQgdG8gZGVhbCB3aXRoIGEgbG90IG9mIG9wdGlvbnM7CgpgYGBkaWZmCiAgICBwdWIgZm4gaXNfam9iX2NvbXBsZXRlZCgpIC0+IGltcGwgQ29uZGl0aW9uPEpvYj4gewogICAgICAgIHxvYmo6IE9wdGlvbjwmSm9iPnwgewotICAgICAgICAgICAgaWYgbGV0IFNvbWUoam9iKSA9ICZvYmogewotICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKHMpID0gJmpvYi5zdGF0dXMgewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShjb25kcykgPSAmcy5jb25kaXRpb25zIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKHBjb25kKSA9IGNvbmRzLml0ZXIoKS5maW5kKHxjfCBjLnR5cGVfID09ICJDb21wbGV0ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGNvbmQuc3RhdHVzID09ICJUcnVlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIGxldCBTb21lKGpvYikgPSAmb2JqCisgICAgICAgICAgICAgICAgJiYgbGV0IFNvbWUocykgPSAmam9iLnN0YXR1cworICAgICAgICAgICAgICAgICYmIGxldCBTb21lKGNvbmRzKSA9ICZzLmNvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAmJiBsZXQgU29tZShwY29uZCkgPSBjb25kcy5pdGVyKCkuZmluZCh8Y3wgYy50eXBlXyA9PSAiQ29tcGxldGUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwY29uZC5zdGF0dXMgPT0gIlRydWUiOwpgYGAKCkNoYW5nZSBbIyYjODIwMzsxODU2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg1NikgKyBbIyYjODIwMzsxNzkyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTc5MikKCiMjIyMjIE5ldyBDbGllbnQgW2BSZXRyeVBvbGljeWBdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL2NsaWVudC9yZXRyeS9zdHJ1Y3QuUmV0cnlQb2xpY3kuaHRtbCkgb3B0LWluCgpBbGxvd3MgY3VzdG9tIGNsaWVudHMgKGZvciBub3cpIHRvIGVuYWJsZSBleHBvbmVudGlhbCBiYWNrb2ZmJ2QgcmV0cmllcyBmb3IgcmV0cnlhYmxlIGVycm9ycyBieSBleHBvc2luZyBhIFtgdG93ZXI6OnJldHJ5OjpQb2xpY3lgXShodHRwczovL3Rvd2VyLXJzLmdpdGh1Yi5pby90b3dlci90b3dlci9yZXRyeS90cmFpdC5Qb2xpY3kuaHRtbCkgZm9yIGEgW2B0b3dlcjo6cmV0cnk6OkxheWVyYF0oaHR0cHM6Ly90b3dlci1ycy5naXRodWIuaW8vdG93ZXIvdG93ZXIvcmV0cnkvc3RydWN0LlJldHJ5TGF5ZXIuaHRtbCkuIFNlZSB0aGUgbmV3IFtjdXN0b21cX2NsaWVudFxfcmV0cnldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvYmxvYi9tYWluL2V4YW1wbGVzL2N1c3RvbV9jbGllbnRfcmV0cnkucnMjTDI0LUwzNykgZXhhbXBsZSBmb3IgZGV0YWlscy4KCkVuYWJsZWQgYnkgYSBbY2xvbmVhYmxlIGJvZHldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODY3KSArIHRoZSBuZXcgW1JldHJ5UG9saWN5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg5NCkgYmFzZWQgb24gbWlycm9yZCdzIHNvbHV0aW9uW1wqXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vbWV0YWxiZWFyLWNvL21pcnJvcmQvYmxvYi9hOWU0YzUyYTcyMGZkNWE4MzNlMzBhZWUxYWM2NTAzNjAwMzFiN2E3L21pcnJvcmQva3ViZS9zcmMvcmV0cnkucnMjTDQxLUwxMzUpLgoKIyMjIyBGaXhlcwoKLSBzdHJlYW1pbmcgbGlzdCBidWcgZml4IC0gWyMmIzgyMDM7MTg4Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODIpCi0gd2F0Y2hlciBqaXR0ZXIgYnVnIGZpeCAtIFsjJiM4MjAzOzE4OTddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODk3KQotIHNjaGVtYSBmaXggZm9yIEludE9yU3RyaW5nIC0gWyMmIzgyMDM7MTg2N10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NjcpCi0gc2NoZW1hIGZpeCBmb3Igb3B0aW9uYWwgZW51bXMgLSBbIyYjODIwMzsxODUzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg1MykKLSB3ZWJzb2NrZXQga2VlcGFsaXZlcyBmb3IgbG9uZyBydW5uaW5nIGF0dGFjaGVzIC0gWyMmIzgyMDM7MTg4OV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODkpCgojIyMjIyBNb3JlCgotIGBSZXNpemVgIHN1YnJlc291cmNlIGltcGwgZm9yIGBQb2RgIC0gWyMmIzgyMDM7MTg1MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NTEpCi0gYWRkIGAjW2t1YmUoYXR0cj0iLi4uIilgIHRvIGFsbG93IGN1c3RvbSBhdHRycyBvbiBkZXJpdmVzIC0gWyMmIzgyMDM7MTg1MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NTApCi0gZXhhbXBsZSB1cGRhdGVzIGZvciBhZG1pc3Npb24gdy9heHVtIC0gWyMmIzgyMDM7MTg1OV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NTkpCgojIyMjIFdoYXQncyBDaGFuZ2VkCgojIyMjIyBBZGRlZAoKLSBBZGQgYFJlc2l6ZWAgc3VicmVzb3VyY2UgZm9yIGBQb2RgIGJ5IFtAJiM4MjAzO2h1Z29wb250aGlldV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2h1Z29wb250aGlldSkgaW4gWyMmIzgyMDM7MTg1MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NTEpCi0gZmVhdDogYWRkICNcW2t1YmUoYXR0cj0iLi4uIildIGF0dHJpYnV0ZSBoZWxwZXIgdG8gc2V0IGF0dHJpYnV0ZSBoZWxwZXIgb24gdGhlIENSIHJvb3QgdHlwZSBieSBbQCYjODIwMztuZ2VyZ3NdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9uZ2VyZ3MpIGluIFsjJiM4MjAzOzE4NTBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODUwKQotIFJ1c3QgMjAyNCBsZXQtY2hhaW5zIHRvIHNpbXBsaWZ5IHdhaXQgQ29uZGl0aW9ucyBieSBbQCYjODIwMztjbHV4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY2x1eCkgaW4gWyMmIzgyMDM7MTc5Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE3OTIpCi0gQWRkcyBhIGB0cnlfY2xvbmVgIG1ldGhvZCBmb3IgYGt1YmVfY2xpZW50OjpjbGllbnQ6OkJvZHlgIHdoZW4gaXQncyBgS2luZDo6T25jZWAgYnkgW0AmIzgyMDM7bWVvd2plc3R5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vbWVvd2plc3R5KSBpbiBbIyYjODIwMzsxODY3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg2NykKLSBJbXBsZW1lbnQgY2xpZW50IGFnZ3JlZ2F0ZWQgZGlzY292ZXJ5IEFQSSBtZXRob2RzIGJ5IFtAJiM4MjAzO2RveHh4OTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kb3h4eDkzKSBpbiBbIyYjODIwMzsxODczXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3MykKLSBJbXBsZW1lbnQgYWdncmVnYXRlZCBkaXNjb3ZlcnkgQVBJIG1ldGhvZHMgYnkgW0AmIzgyMDM7ZG94eHg5M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RveHh4OTMpIGluIFsjJiM4MjAzOzE4NzZdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODc2KQotIFBlcm1pdCBvbGRlciB2ZXJzaW9uIG9mIEFQSSBmb3IgdjIgZGlzY292ZXJ5IGZvciBrOHMgPCAxLjMwIChkb3duIHRvIDEuMjcpIGJ5IFtAJiM4MjAzO0RhbmlsLUdyaWdvcmV2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vRGFuaWwtR3JpZ29yZXYpIGluIFsjJiM4MjAzOzE4ODldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODg5KQotIEFkZCBSZXRyeVBvbGljeSBmb3IgY2xpZW50LWxldmVsIHJlcXVlc3QgcmV0cmllcyBieSBbQCYjODIwMztkb3h4eDkzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG94eHg5MykgaW4gWyMmIzgyMDM7MTg5NF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4OTQpCgojIyMjIyBDaGFuZ2VkCgotIFVwZGF0ZSB0b2tpby10dW5nc3Rlbml0ZSByZXF1aXJlbWVudCBmcm9tIDAuMjcuMCB0byAwLjI4LjAgYnkgW0AmIzgyMDM7ZGVwZW5kYWJvdF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RlcGVuZGFib3QpXFtib3RdIGluIFsjJiM4MjAzOzE4MjldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODI5KQotIFByZWRpY2F0ZXM6IGFkZCBjb25maWd1cmFibGUgY2FjaGUgVFRMIGZvciBgcHJlZGljYXRlX2ZpbHRlcmAgYnkgW0AmIzgyMDM7ZG94eHg5M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RveHh4OTMpIGluIFsjJiM4MjAzOzE4MzhdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODM4KQotIFVwZGF0ZSBkYXJsaW5nIHJlcXVpcmVtZW50IGZyb20gMC4yMS4wIHRvIDAuMjMuMCBieSBbQCYjODIwMztkZXBlbmRhYm90XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZGVwZW5kYWJvdClcW2JvdF0gaW4gWyMmIzgyMDM7MTg2MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NjEpCi0gdXBkYXRlIHRvIGpzb25wYXRoLXJ1c3QgMSBieSBbQCYjODIwMzt0b3R0b3RvXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vdG90dG90bykgaW4gWyMmIzgyMDM7MTg2M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NjMpCi0gUmVwbGFjZSBgY2hyb25vYCB3aXRoIGBqaWZmYCBieSBbQCYjODIwMztuZ2VyZ3NdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9uZ2VyZ3MpIGluIFsjJiM4MjAzOzE4NjhdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODY4KQotIE1lcmdlIEVycm9yUmVzcG9uc2UgYW5kIFN0YXR1cyBieSBbQCYjODIwMztpbXBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9pbXApIGluIFsjJiM4MjAzOzE4NzVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODc1KQotIE1ha2Ugc3VicmVzb3VyY2UgbWV0aG9kcyBtb3JlIGVyZ29ub21pYyBieSBbQCYjODIwMztkb3h4eDkzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG94eHg5MykgaW4gWyMmIzgyMDM7MTg4NF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODQpCi0gRHJvcCBrOHMgdjEuMzAsIGNyb25vLT5qaWZmIHJlcGxhY2VtZW50IGZvciBydW50aW1lICYgZXhhbXBsZXMgYnkgW0AmIzgyMDM7bmdlcmdzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vbmdlcmdzKSBpbiBbIyYjODIwMzsxODcwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3MCkKLSBBZGQgYSBtZXRhZGF0YSBmaWVsZCB0byBTdGF0dXMgYnkgW0AmIzgyMDM7cnlhbnBicmV3c3Rlcl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL3J5YW5wYnJld3N0ZXIpIGluIFsjJiM4MjAzOzE4OTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODkxKQotIEJ1bXAgYGs4cy1vcGVuYXBpYCBmb3IgS3ViZXJuZXRlcyAxLjM1IGJ5IFtAJiM4MjAzO2NsdXhdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jbHV4KSBpbiBbIyYjODIwMzsxODk4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg5OCkKCiMjIyMjIEZpeGVkCgotIGZpeDogYWRkIHVzZTw+IHRvIGt1YmVsZXRcX25vZGVcX2xvZ3MgZm9yIHJ1c3QgZWRpdGlvbiAyMDI0IGJ5IFtAJiM4MjAzO2NvNDJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jbzQyKSBpbiBbIyYjODIwMzsxODQ5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg0OSkKLSBUcmFuc2Zvcm0gb3B0aW9uYWwgZW51bXMgdG8gbWF0Y2ggcHJlIGt1YmUgMi4wLjAgZm9ybWF0IGJ5IFtAJiM4MjAzO0RhbmlsLUdyaWdvcmV2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vRGFuaWwtR3JpZ29yZXYpIGluIFsjJiM4MjAzOzE4NTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODUzKQotIERpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdGlhbCBhbmQgcmVzdW1lZCB3YXRjaCBwaGFzZXMgZm9yIHN0cmVhbWluZyBsaXN0cyBieSBbQCYjODIwMztkb3h4eDkzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG94eHg5MykgaW4gWyMmIzgyMDM7MTg4Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODIpCi0gUmUtZXhwb3J0IGRlcHJlY2F0ZWQgdHlwZSBhbGlhcyBhbmQgaW1wcm92ZSBkZXByZWNhdGlvbiBndWlkYW5jZSBieSBbQCYjODIwMztjbHV4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY2x1eCkgaW4gWyMmIzgyMDM7MTg4M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODMpCi0gQWRkIG51bGxhYmxlIHRvIG9wdGlvbmFsIGZpZWxkcyB3aXRoIHgta3ViZXJuZXRlcy1pbnQtb3Itc3RyaW5nIGJ5IFtAJiM4MjAzO2RveHh4OTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kb3h4eDkzKSBpbiBbIyYjODIwMzsxODg1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg4NSkKLSBzZW5kIHdlYnNvY2tldCBwaW5nIHRvIGtlZXAgaWRsZSBjb25uZWN0aW9ucyBhbGl2ZSBieSBbQCYjODIwMztpbnFvZGUtbGFyc10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2lucW9kZS1sYXJzKSBpbiBbIyYjODIwMzsxODg3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg4NykKLSBGaXggd2F0Y2hlciBFeHBvbmVudGlhbEJhY2tvZmYgaml0dGVyIGlnbm9yZWQgYnkgW0AmIzgyMDM7ZG94eHg5M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RveHh4OTMpIGluIFsjJiM4MjAzOzE4OTddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODk3KQoKIyMjIFtgdjIuMC4xYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9ibG9iL0hFQUQvQ0hBTkdFTE9HLm1kIzIwMS0tMjAyNS0wOS0xMikKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9jb21wYXJlLzIuMC4wLi4uMi4wLjEpCgpcPT09PT09PT09PT09PT09PT09PQoKPCEtLSBSZWxlYXNlIG5vdGVzIGdlbmVyYXRlZCB1c2luZyBjb25maWd1cmF0aW9uIGluIC5naXRodWIvcmVsZWFzZS55bWwgYXQgMi4wLjEgLS0+CgojIyMjIFdoYXQncyBDaGFuZ2VkCgpGaXhlcyBhbiBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiBhIGNvbnN0cmFpbnQgYWRkZWQgdG8gYEFwaTo6bG9nX3N0cmVhbWAgaW50cm9kdWNlZCBpbiB0aGUgMi4wLjAgUnVzdCAyMDI0IHVwZ3JhZGUuCgojIyMjIyBGaXhlZAoKLSBSZW1vdmUgdW51c2VkIHVzZTwnXF8+IGZyb20gbG9nXF9zdHJlYW0oKSBieSBbQCYjODIwMztwZ2VyYmVyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vcGdlcmJlcikgaW4gWyMmIzgyMDM7MTgyNF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4MjQpCgojIyMgW2B2Mi4wLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL2Jsb2IvSEVBRC9DSEFOR0VMT0cubWQjMzAwLS0yMDI2LTAxLTEyKQoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL2NvbXBhcmUvMS4xLjAuLi4yLjAuMCkKClw9PT09PT09PT09PT09PT09PT09Cgo8IS0tIFJlbGVhc2Ugbm90ZXMgZ2VuZXJhdGVkIHVzaW5nIGNvbmZpZ3VyYXRpb24gaW4gLmdpdGh1Yi9yZWxlYXNlLnltbCBhdCAzLjAuMCAtLT4KCiMjIyMgTmV3IE1ham9yCgpBcyBwZXIgdGhlIG5ldyByZWxlYXNlIHNjaGVkdWxlIHRvIG1hdGNoIHVwIHdpdGggdGhlIG5ldyBLdWJlcm5ldGVzIHJlbGVhc2UuCkxvdHMgb2YgYWRkaXRpb25zLCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gZXZlcnlvbmUgd2hvIGNvbnRyaWJ1dGVkIHNvIGhlYXZpbHkgb3ZlciB0aGUgaG9saWRheXMhIEhhcHB5IG5ldyB5ZWFyLgoKIyMjIyBCcmVha2luZyBDaGFuZ2VzCgojIyMjIyBLdWJlcm5ldGVzIGB2MV8zNWAgc3VwcG9ydCB2aWEgazhzLW9wZW5hcGkgWzAuMjddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9Bcm5hdmlvbi9rOHMtb3BlbmFwaS9yZWxlYXNlcy90YWcvdjAuMjcuMCkKClBsZWFzZSBbdXBncmFkZSBrOHMtb3BlbmFwaSBhbG9uZyB3aXRoIGt1YmVdKGh0dHBzOi8va3ViZS5ycy91cGdyYWRpbmcvKSB0byBhdm9pZCBjb25mbGljdHMuCgojIyMjIyBgamlmZmAgcmVwbGFjZXMgYGNocm9ub2AKCk1hdGNoaW5nIGs4cy1vcGVuYXBpJ3MgW2NoYW5nZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL0FybmF2aW9uL2s4cy1vcGVuYXBpL2NvbW1pdC84YzFiNmZjY2I3MjU4ZWI0ODdlZDhjODI5NzkxZDQyN2E0YjE2MjE2KSwga3ViZSBoYXMgYWxzbyBzd2FwcGVkIG91dCBgY2hyb25vYC4gVGhlIGJpZ2dlc3QgaW1wYWN0IG9mIHRoaXMgaXMgZm9yIGludGVyYWN0aW5nIHdpdGggdGltZXN0YW1wcyBpbiBgbWV0YWRhdGFgLCBidXQgaXQgYWxzbyB1cGRhdGVzIDIgc21hbGxlciBwdWJsaWMgaW50ZXJmYWNlcyBpbiBbYExvZ1BhcmFtc2BdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL2FwaS9zdHJ1Y3QuTG9nUGFyYW1zLmh0bWwjc3RydWN0ZmllbGQuc2luY2VfdGltZSksIFtgQ2xpZW50Ojp3aXRoX3ZhbGlkX3VudGlsYF0oaHR0cHM6Ly9kb2NzLnJzL2t1YmUvbGF0ZXN0L2t1YmUvc3RydWN0LkNsaWVudC5odG1sI21ldGhvZC53aXRoX3ZhbGlkX3VudGlsKS4gIFNlZSBbY29udHJvbGxlci1ycyMyMTddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2NvbnRyb2xsZXItcnMvcHVsbC8yMTcvY2hhbmdlcykgZm9yIGFuIGV4YW1wbGUgY2hhbmdlLgoKQ2hhbmdlczogWyMmIzgyMDM7MTg2OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NjgpICsgWyMmIzgyMDM7MTg3MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NzApCgojIyMjIGBFcnJvclJlc3BvbnNlYCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIFtgU3RhdHVzYF0oaHR0cHM6Ly9kb2NzLnJzL2t1YmUvbGF0ZXN0L2t1YmUvY29yZS9zdHJ1Y3QuU3RhdHVzLmh0bWwpCgpgRXJyb3JSZXNwb25zZWAgc2VydmVkIGFzIGEgcGFydGlhbCBtZXRhdjEvU3RhdHVzIHJlcGxhY2VtZW50IHdoaWNoIGVuZGVkIHVwIGhpZGluZyBlcnJvciBpbmZvcm1hdGlvbiB0byB1c2Vycy4gVGhlc2Ugc3RydWN0cyBoYXZlIG1lcmdlZCwgbW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb24gZXJyb3JzLCBhbmQgYSB0eXBlIGFsaWFzIHdpdGggYSBkZXByZWNhdGlvbiB3YXJuaW5nIGlzIGluIHBsYWNlIGZvciBbYEVycm9yUmVzcG9uc2VgXShodHRwczovL2RvY3MucnMva3ViZS9sYXRlc3Qva3ViZS9jb3JlL3R5cGUuRXJyb3JSZXNwb25zZS5odG1sKSB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBjcmVhdGVzIGEgc21hbGwgYnJlYWtpbmcgY2hhbmdlIGZvciB1c2VycyBtYXRjaGluZyBvbiBzcGVjaWZpYyBbYEVycm9yOjpBcGlgXShodHRwczovL2RvY3MucnMva3ViZS9sYXRlc3Qva3ViZS9lbnVtLkVycm9yLmh0bWwjdmFyaWFudC5BcGkpIGNvZGVzOwoKYGBgZGlmZgogICAgIC5tYXBfZXJyKHxlcnJvcnwgbWF0Y2ggZXJyb3IgewotICAgICAgICBrdWJlOjpFcnJvcjo6QXBpKGt1YmU6OmVycm9yOjpFcnJvclJlc3BvbnNlIHsgY29kZTogNDAzLCAuLiB9KSA9PiB7Ci0gICAgICAgICAgICBFcnJvcjo6VW5hdXRob3JpemVkVG9QYXRjaChvYmopCi0gICAgICAgIH0KKyAgICAgICAga3ViZTo6RXJyb3I6OkFwaShzKSBpZiBzLmlzX2ZvcmJpZGRlbigpID0+IEVycm9yOjpVbmF1dGhvcml6ZWRUb1BhdGNoKG9iaiksCiAgICAgICAgIG90aGVyID0+IEVycm9yOjpPdGhlcihvdGhlciksCiAgICAgfSk/OwpgYGAKClsjJiM4MjAzOzE4NzVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODc1KSArIFsjJiM4MjAzOzE4ODNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODgzKSArIFsjJiM4MjAzOzE4OTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODkxKS4KCiMjIyMgUHJlZGljYXRlcyBub3cgaGFzIGEgVFRMIENhY2hlCgpUaGlzIHByZXZlbnRzIHVuYm91bmRlZCBtZW1vcnkgZm9yIGNvbnRyb2xsZXJzLCBwYXJ0aWN1bGFybHkgYWZmZWN0aW5nIG9uZXMgd2F0Y2hpbmcgcXVpY2tseSByb3RhdGluZyBvYmplY3RzIHdpdGggZ2VuZXJhdGVkIG5hbWVzIChlLmcuIHBvZHMpLiBCeSBkZWZhdWx0IHRoZSBUVEwgaXMgYDFoYC4gSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIG5ldyBbYFByZWRpY2F0ZUNvbmZpZ2BdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL3J1bnRpbWUvc3RydWN0LlByZWRpY2F0ZUNvbmZpZy5odG1sKSBwYXJhbWV0ZXIuIFRvIHVzZSB0aGUgZGVmYXVsdDsKCmBgYGRpZmYKLSAgICAgICAgLnByZWRpY2F0ZV9maWx0ZXIocHJlZGljYXRlczo6cmVzb3VyY2VfdmVyc2lvbik7CisgICAgICAgIC5wcmVkaWNhdGVfZmlsdGVyKHByZWRpY2F0ZXM6OnJlc291cmNlX3ZlcnNpb24sIERlZmF1bHQ6OmRlZmF1bHQoKSk7CmBgYAoKQ2hhbmdlIGluIFsjJiM4MjAzOzE4MzZdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODM2KS4gVGhpcyBoZWxwZWQgZXhwb3NlIGFuZCBmaXggYSBidWcgaW4gd2F0Y2hlcyB3aXRoIHN0cmVhbWluZ1xfbGlzdHMgbm93IGZpeGVkIGluIFsjJiM4MjAzOzE4ODJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODgyKS4KCiMjIyMgU3VicmVzb3VyY2UgQXBpCgpTb21lIHN1YnJlc291cmNlIHdyaXRlIG1ldGhvZHMgd2VyZSBwdWJsaWMgd2l0aCBpbmNvbnNpc3RlbnQgc2lnbmF0dXJlcyB0aGF0IHJlcXVpcmVkIGxlc3MgZXJnb25vbWljIHVzZSB0aGFuIGFueSBvdGhlciB3cml0ZSBtZXRob2RzLiBUaGV5IHRvb2sgYSBgVmVjPHU4PmAgZm9yIHRoZSBwb3N0IGJvZHksIG5vdyB0aGV5IHRha2UgYSBgJks6IFNlcmlhbGl6ZWAgb3IgdGhlIGFjdHVhbCBzdWJyZXNvdXJjZS4KVGhlcmUgYWZmZWN0IGBBcGk6OmNyZWF0ZV9zdWJyZXNvdXJjZWAsIGBBcGk6OnJlcGxhY2Vfc3VicmVzb3VyY2VgLCBbYEFwaTo6cmVwbGFjZV9zdGF0dXNgXShodHRwczovL2RvY3MucnMva3ViZS9sYXRlc3Qva3ViZS9zdHJ1Y3QuQXBpLmh0bWwjbWV0aG9kLnJlcGxhY2Vfc3RhdHVzKSwgYEFwaTo6cmVwbGFjZV9zY2FsZWAuIEluIGVzc2VuY2UgdGhpcyBnZW5lcmFsbHkgbWVhbnMgeW91IGRvIG5vdCBoYXZlIHRvIHdyYXAgcmF3IG9iamVjdHMgaW4gYGpzb24hYCBhbmQgYHNlcmRlX2pzb246OnRvX3ZlY2AgZm9yIHRoZXNlIGNhbGxzIGFuZCBsZWFuIG1vcmUgb24gcnVzdCdzIHR5cGVkIG9iamVjdHMgcmF0aGVyIHRoYW4gYGpzb24hYCBibG9icyB3aGljaCBoYXMgc29tZSBbZm9vdGd1bnNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODg0I2Rpc2N1c3Npb25fcjI2ODA3ODI1NTYpIGZvciBzdWJyZXNvdXJjZXMuCgpgYGBkaWZmCi0gICAgbGV0IG8gPSBmb29zLnJlcGxhY2Vfc3RhdHVzKCJxdXgiLCAmcHAsIHNlcmRlX2pzb246OnRvX3ZlYygmb2JqZWN0KT8pLmF3YWl0PzsKKyAgICBsZXQgbyA9IGZvb3MucmVwbGFjZV9zdGF0dXMoInF1eCIsICZwcCwgJm9iamVjdCkuYXdhaXQ/OwpgYGAKClNlZSBzb21lIG1vcmUgc2hpZnRzIGluIGV4YW1wbGVzIGluIHRoZSBpbXBsZW1lbnRhdGlvbjsgWyMmIzgyMDM7MTg4NF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODQpCgojIyMjIEltcHJvdmVtZW50cwoKIyMjIyMgU3VwcG9ydCBLdWJlcm5ldGVzIDEuMzAgW0FnZ3JlZ2F0ZWQgRGlzY292ZXJ5XShodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy9rdWJlcm5ldGVzLWFwaS8jYWdncmVnYXRlZC1kaXNjb3ZlcnkpCgpTcGVlZHMgdXAgYXBpIGRpc2NvdmVyeSAqKnNpZ25pZmljYW50bHkqKiBieSB1c2luZyB0aGUgbmV3ZXIgYXBpIHdpdGggbXVjaCBsZXNzIHJvdW5kLXRyaXBwaW5nLgpUbyBvcHQtaW4gY2hhbmdlIGBEaXNjb3Zlcnk6OnJ1bigpYCB0byBbYERpc2NvdmVyeTo6cnVuX2FnZ3JlZ2F0ZWQoKWBdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL3N0cnVjdC5EaXNjb3ZlcnkuaHRtbCNtZXRob2QucnVuX2FnZ3JlZ2F0ZWQpCgpDaGFuZ2VzOyBbIyYjODIwMzsxODc2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3NikgKyBbIyYjODIwMzsxODczXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3MykgKyBbIyYjODIwMzsxODg5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg4OSkKCiMjIyMjIFJ1c3QgMjAyNAoKV2hpbGUgdGhpcyBpcyBtb3N0bHkgZm9yIGludGVybmFsIGVyZ29ub21pY3MsIHdlIHdvdWxkIGxpa2UgdG8gaGlnaGxpZ2h0IHRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBbYENvbmRpdGlvbmBdKGh0dHBzOi8vZG9jcy5ycy9rdWJlL2xhdGVzdC9rdWJlL3J1bnRpbWUvd2FpdC9jb25kaXRpb25zL3RyYWl0LkNvbmRpdGlvbi5odG1sKSBpbXBsZW1lbnRvcnMgd2hpY2ggaGFkIHRvIGRlYWwgd2l0aCBhIGxvdCBvZiBvcHRpb25zOwoKYGBgZGlmZgogICAgcHViIGZuIGlzX2pvYl9jb21wbGV0ZWQoKSAtPiBpbXBsIENvbmRpdGlvbjxKb2I+IHsKICAgICAgICB8b2JqOiBPcHRpb248JkpvYj58IHsKLSAgICAgICAgICAgIGlmIGxldCBTb21lKGpvYikgPSAmb2JqIHsKLSAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShzKSA9ICZqb2Iuc3RhdHVzIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgbGV0IFNvbWUoY29uZHMpID0gJnMuY29uZGl0aW9ucyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShwY29uZCkgPSBjb25kcy5pdGVyKCkuZmluZCh8Y3wgYy50eXBlXyA9PSAiQ29tcGxldGUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjb25kLnN0YXR1cyA9PSAiVHJ1ZSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiBsZXQgU29tZShqb2IpID0gJm9iagorICAgICAgICAgICAgICAgICYmIGxldCBTb21lKHMpID0gJmpvYi5zdGF0dXMKKyAgICAgICAgICAgICAgICAmJiBsZXQgU29tZShjb25kcykgPSAmcy5jb25kaXRpb25zCisgICAgICAgICAgICAgICAgJiYgbGV0IFNvbWUocGNvbmQpID0gY29uZHMuaXRlcigpLmZpbmQofGN8IGMudHlwZV8gPT0gIkNvbXBsZXRlIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGNvbmQuc3RhdHVzID09ICJUcnVlIjsKYGBgCgpDaGFuZ2UgWyMmIzgyMDM7MTg1Nl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NTYpICsgWyMmIzgyMDM7MTc5Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE3OTIpCgojIyMjIyBOZXcgQ2xpZW50IFtgUmV0cnlQb2xpY3lgXShodHRwczovL2RvY3MucnMva3ViZS9sYXRlc3Qva3ViZS9jbGllbnQvcmV0cnkvc3RydWN0LlJldHJ5UG9saWN5Lmh0bWwpIG9wdC1pbgoKQWxsb3dzIGN1c3RvbSBjbGllbnRzIChmb3Igbm93KSB0byBlbmFibGUgZXhwb25lbnRpYWwgYmFja29mZidkIHJldHJpZXMgZm9yIHJldHJ5YWJsZSBlcnJvcnMgYnkgZXhwb3NpbmcgYSBbYHRvd2VyOjpyZXRyeTo6UG9saWN5YF0oaHR0cHM6Ly90b3dlci1ycy5naXRodWIuaW8vdG93ZXIvdG93ZXIvcmV0cnkvdHJhaXQuUG9saWN5Lmh0bWwpIGZvciBhIFtgdG93ZXI6OnJldHJ5OjpMYXllcmBdKGh0dHBzOi8vdG93ZXItcnMuZ2l0aHViLmlvL3Rvd2VyL3Rvd2VyL3JldHJ5L3N0cnVjdC5SZXRyeUxheWVyLmh0bWwpLiBTZWUgdGhlIG5ldyBbY3VzdG9tXF9jbGllbnRcX3JldHJ5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL2Jsb2IvbWFpbi9leGFtcGxlcy9jdXN0b21fY2xpZW50X3JldHJ5LnJzI0wyNC1MMzcpIGV4YW1wbGUgZm9yIGRldGFpbHMuCgpFbmFibGVkIGJ5IGEgW2Nsb25lYWJsZSBib2R5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg2NykgKyB0aGUgbmV3IFtSZXRyeVBvbGljeV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4OTQpIGJhc2VkIG9uIG1pcnJvcmQncyBzb2x1dGlvbltcKl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL21ldGFsYmVhci1jby9taXJyb3JkL2Jsb2IvYTllNGM1MmE3MjBmZDVhODMzZTMwYWVlMWFjNjUwMzYwMDMxYjdhNy9taXJyb3JkL2t1YmUvc3JjL3JldHJ5LnJzI0w0MS1MMTM1KS4KCiMjIyMgRml4ZXMKCi0gc3RyZWFtaW5nIGxpc3QgYnVnIGZpeCAtIFsjJiM4MjAzOzE4ODJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODgyKQotIHdhdGNoZXIgaml0dGVyIGJ1ZyBmaXggLSBbIyYjODIwMzsxODk3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg5NykKLSBzY2hlbWEgZml4IGZvciBJbnRPclN0cmluZyAtIFsjJiM4MjAzOzE4NjddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODY3KQotIHNjaGVtYSBmaXggZm9yIG9wdGlvbmFsIGVudW1zIC0gWyMmIzgyMDM7MTg1M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NTMpCi0gd2Vic29ja2V0IGtlZXBhbGl2ZXMgZm9yIGxvbmcgcnVubmluZyBhdHRhY2hlcyAtIFsjJiM4MjAzOzE4ODldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODg5KQoKIyMjIyMgTW9yZQoKLSBgUmVzaXplYCBzdWJyZXNvdXJjZSBpbXBsIGZvciBgUG9kYCAtIFsjJiM4MjAzOzE4NTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODUxKQotIGFkZCBgI1trdWJlKGF0dHI9Ii4uLiIpYCB0byBhbGxvdyBjdXN0b20gYXR0cnMgb24gZGVyaXZlcyAtIFsjJiM4MjAzOzE4NTBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODUwKQotIGV4YW1wbGUgdXBkYXRlcyBmb3IgYWRtaXNzaW9uIHcvYXh1bSAtIFsjJiM4MjAzOzE4NTldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODU5KQoKIyMjIyBXaGF0J3MgQ2hhbmdlZAoKIyMjIyMgQWRkZWQKCi0gQWRkIGBSZXNpemVgIHN1YnJlc291cmNlIGZvciBgUG9kYCBieSBbQCYjODIwMztodWdvcG9udGhpZXVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9odWdvcG9udGhpZXUpIGluIFsjJiM4MjAzOzE4NTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODUxKQotIGZlYXQ6IGFkZCAjXFtrdWJlKGF0dHI9Ii4uLiIpXSBhdHRyaWJ1dGUgaGVscGVyIHRvIHNldCBhdHRyaWJ1dGUgaGVscGVyIG9uIHRoZSBDUiByb290IHR5cGUgYnkgW0AmIzgyMDM7bmdlcmdzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vbmdlcmdzKSBpbiBbIyYjODIwMzsxODUwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg1MCkKLSBSdXN0IDIwMjQgbGV0LWNoYWlucyB0byBzaW1wbGlmeSB3YWl0IENvbmRpdGlvbnMgYnkgW0AmIzgyMDM7Y2x1eF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2NsdXgpIGluIFsjJiM4MjAzOzE3OTJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xNzkyKQotIEFkZHMgYSBgdHJ5X2Nsb25lYCBtZXRob2QgZm9yIGBrdWJlX2NsaWVudDo6Y2xpZW50OjpCb2R5YCB3aGVuIGl0J3MgYEtpbmQ6Ok9uY2VgIGJ5IFtAJiM4MjAzO21lb3dqZXN0eV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL21lb3dqZXN0eSkgaW4gWyMmIzgyMDM7MTg2N10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NjcpCi0gSW1wbGVtZW50IGNsaWVudCBhZ2dyZWdhdGVkIGRpc2NvdmVyeSBBUEkgbWV0aG9kcyBieSBbQCYjODIwMztkb3h4eDkzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG94eHg5MykgaW4gWyMmIzgyMDM7MTg3M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NzMpCi0gSW1wbGVtZW50IGFnZ3JlZ2F0ZWQgZGlzY292ZXJ5IEFQSSBtZXRob2RzIGJ5IFtAJiM4MjAzO2RveHh4OTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kb3h4eDkzKSBpbiBbIyYjODIwMzsxODc2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3NikKLSBQZXJtaXQgb2xkZXIgdmVyc2lvbiBvZiBBUEkgZm9yIHYyIGRpc2NvdmVyeSBmb3IgazhzIDwgMS4zMCAoZG93biB0byAxLjI3KSBieSBbQCYjODIwMztEYW5pbC1Hcmlnb3Jldl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL0RhbmlsLUdyaWdvcmV2KSBpbiBbIyYjODIwMzsxODg5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg4OSkKLSBBZGQgUmV0cnlQb2xpY3kgZm9yIGNsaWVudC1sZXZlbCByZXF1ZXN0IHJldHJpZXMgYnkgW0AmIzgyMDM7ZG94eHg5M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RveHh4OTMpIGluIFsjJiM4MjAzOzE4OTRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODk0KQoKIyMjIyMgQ2hhbmdlZAoKLSBVcGRhdGUgdG9raW8tdHVuZ3N0ZW5pdGUgcmVxdWlyZW1lbnQgZnJvbSAwLjI3LjAgdG8gMC4yOC4wIGJ5IFtAJiM4MjAzO2RlcGVuZGFib3RdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kZXBlbmRhYm90KVxbYm90XSBpbiBbIyYjODIwMzsxODI5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTgyOSkKLSBQcmVkaWNhdGVzOiBhZGQgY29uZmlndXJhYmxlIGNhY2hlIFRUTCBmb3IgYHByZWRpY2F0ZV9maWx0ZXJgIGJ5IFtAJiM4MjAzO2RveHh4OTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kb3h4eDkzKSBpbiBbIyYjODIwMzsxODM4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTgzOCkKLSBVcGRhdGUgZGFybGluZyByZXF1aXJlbWVudCBmcm9tIDAuMjEuMCB0byAwLjIzLjAgYnkgW0AmIzgyMDM7ZGVwZW5kYWJvdF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RlcGVuZGFib3QpXFtib3RdIGluIFsjJiM4MjAzOzE4NjFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODYxKQotIHVwZGF0ZSB0byBqc29ucGF0aC1ydXN0IDEgYnkgW0AmIzgyMDM7dG90dG90b10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL3RvdHRvdG8pIGluIFsjJiM4MjAzOzE4NjNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODYzKQotIFJlcGxhY2UgYGNocm9ub2Agd2l0aCBgamlmZmAgYnkgW0AmIzgyMDM7bmdlcmdzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vbmdlcmdzKSBpbiBbIyYjODIwMzsxODY4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg2OCkKLSBNZXJnZSBFcnJvclJlc3BvbnNlIGFuZCBTdGF0dXMgYnkgW0AmIzgyMDM7aW1wXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vaW1wKSBpbiBbIyYjODIwMzsxODc1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg3NSkKLSBNYWtlIHN1YnJlc291cmNlIG1ldGhvZHMgbW9yZSBlcmdvbm9taWMgYnkgW0AmIzgyMDM7ZG94eHg5M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RveHh4OTMpIGluIFsjJiM4MjAzOzE4ODRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODg0KQotIERyb3AgazhzIHYxLjMwLCBjcm9uby0+amlmZiByZXBsYWNlbWVudCBmb3IgcnVudGltZSAmIGV4YW1wbGVzIGJ5IFtAJiM4MjAzO25nZXJnc10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL25nZXJncykgaW4gWyMmIzgyMDM7MTg3MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NzApCi0gQWRkIGEgbWV0YWRhdGEgZmllbGQgdG8gU3RhdHVzIGJ5IFtAJiM4MjAzO3J5YW5wYnJld3N0ZXJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9yeWFucGJyZXdzdGVyKSBpbiBbIyYjODIwMzsxODkxXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg5MSkKLSBCdW1wIGBrOHMtb3BlbmFwaWAgZm9yIEt1YmVybmV0ZXMgMS4zNSBieSBbQCYjODIwMztjbHV4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY2x1eCkgaW4gWyMmIzgyMDM7MTg5OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4OTgpCgojIyMjIyBGaXhlZAoKLSBmaXg6IGFkZCB1c2U8PiB0byBrdWJlbGV0XF9ub2RlXF9sb2dzIGZvciBydXN0IGVkaXRpb24gMjAyNCBieSBbQCYjODIwMztjbzQyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY280MikgaW4gWyMmIzgyMDM7MTg0OV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4NDkpCi0gVHJhbnNmb3JtIG9wdGlvbmFsIGVudW1zIHRvIG1hdGNoIHByZSBrdWJlIDIuMC4wIGZvcm1hdCBieSBbQCYjODIwMztEYW5pbC1Hcmlnb3Jldl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL0RhbmlsLUdyaWdvcmV2KSBpbiBbIyYjODIwMzsxODUzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg1MykKLSBEaXN0aW5ndWlzaCBiZXR3ZWVuIGluaXRpYWwgYW5kIHJlc3VtZWQgd2F0Y2ggcGhhc2VzIGZvciBzdHJlYW1pbmcgbGlzdHMgYnkgW0AmIzgyMDM7ZG94eHg5M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RveHh4OTMpIGluIFsjJiM4MjAzOzE4ODJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODgyKQotIFJlLWV4cG9ydCBkZXByZWNhdGVkIHR5cGUgYWxpYXMgYW5kIGltcHJvdmUgZGVwcmVjYXRpb24gZ3VpZGFuY2UgYnkgW0AmIzgyMDM7Y2x1eF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2NsdXgpIGluIFsjJiM4MjAzOzE4ODNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9rdWJlLXJzL2t1YmUvcHVsbC8xODgzKQotIEFkZCBudWxsYWJsZSB0byBvcHRpb25hbCBmaWVsZHMgd2l0aCB4LWt1YmVybmV0ZXMtaW50LW9yLXN0cmluZyBieSBbQCYjODIwMztkb3h4eDkzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG94eHg5MykgaW4gWyMmIzgyMDM7MTg4NV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODUpCi0gc2VuZCB3ZWJzb2NrZXQgcGluZyB0byBrZWVwIGlkbGUgY29ubmVjdGlvbnMgYWxpdmUgYnkgW0AmIzgyMDM7aW5xb2RlLWxhcnNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9pbnFvZGUtbGFycykgaW4gWyMmIzgyMDM7MTg4N10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2t1YmUtcnMva3ViZS9wdWxsLzE4ODcpCi0gRml4IHdhdGNoZXIgRXhwb25lbnRpYWxCYWNrb2ZmIGppdHRlciBpZ25vcmVkIGJ5IFtAJiM4MjAzO2RveHh4OTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kb3h4eDkzKSBpbiBbIyYjODIwMzsxODk3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3ViZS1ycy9rdWJlL3B1bGwvMTg5NykKCjwvZGV0YWlscz4KCi0tLQoKIyMjIENvbmZpZ3VyYXRpb24KCvCfk4UgKipTY2hlZHVsZSoqOiBCcmFuY2ggY3JlYXRpb24gLSBBdCBhbnkgdGltZSAobm8gc2NoZWR1bGUgZGVmaW5lZCksIEF1dG9tZXJnZSAtIEF0IGFueSB0aW1lIChubyBzY2hlZHVsZSBkZWZpbmVkKS4KCvCfmqYgKipBdXRvbWVyZ2UqKjogRGlzYWJsZWQgYnkgY29uZmlnLiBQbGVhc2UgbWVyZ2UgdGhpcyBtYW51YWxseSBvbmNlIHlvdSBhcmUgc2F0aXNmaWVkLgoK4pm7ICoqUmViYXNpbmcqKjogV2hlbmV2ZXIgUFIgYmVjb21lcyBjb25mbGljdGVkLCBvciB5b3UgdGljayB0aGUgcmViYXNlL3JldHJ5IGNoZWNrYm94LgoK8J+UlSAqKklnbm9yZSoqOiBDbG9zZSB0aGlzIFBSIGFuZCB5b3Ugd29uJ3QgYmUgcmVtaW5kZWQgYWJvdXQgdGhpcyB1cGRhdGUgYWdhaW4uCgotLS0KCiAtIFsgXSA8IS0tIHJlYmFzZS1jaGVjayAtLT5JZiB5b3Ugd2FudCB0byByZWJhc2UvcmV0cnkgdGhpcyBQUiwgY2hlY2sgdGhpcyBib3gKCi0tLQoKVGhpcyBQUiB3YXMgZ2VuZXJhdGVkIGJ5IFtNZW5kIFJlbm92YXRlXShodHRwczovL21lbmQuaW8vcmVub3ZhdGUvKS4gVmlldyB0aGUgW3JlcG9zaXRvcnkgam9iIGxvZ10oaHR0cHM6Ly9kZXZlbG9wZXIubWVuZC5pby9naXRodWIvdmV4eGhvc3QvbWFnbnVtLWNsdXN0ZXItYXBpKS4KPCEtLXJlbm92YXRlLWRlYnVnOmV5SmpjbVZoZEdWa1NXNVdaWElpT2lJME1DNHhNUzQ1SWl3aWRYQmtZWFJsWkVsdVZtVnlJam9pTkRNdU5qWXVOQ0lzSW5SaGNtZGxkRUp5WVc1amFDSTZJbTFoYVc0aUxDSnNZV0psYkhNaU9sdGRmUT09LS0+Cg==
      override_checkout: master
      patchset: f460b032bbb082b3cdc5e95b900385d6c48c12ea
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: 416d27e89e0c1891921fee2a692086eb8fcd0307
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: 66d74bbbd6770c9ee1f9179cf69c1687197f2a5a
          untrusted/project_2/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          untrusted/project_3/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: f460b032bbb082b3cdc5e95b900385d6c48c12ea
        playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/run.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_5/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/post.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_5/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/post.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/post_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_4/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_2/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_2/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_2/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_2/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_3/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_3/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_3/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_3/role_2/zuul-jobs/roles
        pre_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/pre.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_0/role_2/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/pre.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_4/zuul-jobs/roles
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/pre.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_2/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_2/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_5/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/magnum-cluster-api
        name: vexxhost/magnum-cluster-api
        short_name: magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
      projects:
        github.com/novnc/novnc:
          canonical_hostname: github.com
          canonical_name: github.com/novnc/novnc
          checkout: master
          checkout_description: job override ref
          commit: 8e1ebdffba02e651c399dacef841f8941f6ad6e4
          name: novnc/novnc
          required: true
          short_name: novnc
          src_dir: src/github.com/novnc/novnc
        github.com/vexxhost/magnum-cluster-api:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          checkout: main
          checkout_description: zuul branch
          commit: f460b032bbb082b3cdc5e95b900385d6c48c12ea
          name: vexxhost/magnum-cluster-api
          required: false
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        opendev.org/openstack/barbican:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/barbican
          checkout: master
          checkout_description: job override ref
          commit: f8a331a40eb21e6c8f37e07794d57aa98b120af9
          name: openstack/barbican
          required: true
          short_name: barbican
          src_dir: src/opendev.org/openstack/barbican
        opendev.org/openstack/cinder:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/cinder
          checkout: master
          checkout_description: job override ref
          commit: 071d0d897c02e7db8c8be8b87faf376c53b53896
          name: openstack/cinder
          required: true
          short_name: cinder
          src_dir: src/opendev.org/openstack/cinder
        opendev.org/openstack/devstack:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/devstack
          checkout: master
          checkout_description: job override ref
          commit: 416d27e89e0c1891921fee2a692086eb8fcd0307
          name: openstack/devstack
          required: true
          short_name: devstack
          src_dir: src/opendev.org/openstack/devstack
        opendev.org/openstack/glance:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/glance
          checkout: master
          checkout_description: job override ref
          commit: 011776ae9f3aba04dce7b6b3ad24004f5406b82a
          name: openstack/glance
          required: true
          short_name: glance
          src_dir: src/opendev.org/openstack/glance
        opendev.org/openstack/keystone:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/keystone
          checkout: master
          checkout_description: job override ref
          commit: 3526925ae34a66e626bec985628a421a7694168e
          name: openstack/keystone
          required: true
          short_name: keystone
          src_dir: src/opendev.org/openstack/keystone
        opendev.org/openstack/magnum:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/magnum
          checkout: master
          checkout_description: job override ref
          commit: b5941f365a1ec5c3390a6145e2a808e0a79b960e
          name: openstack/magnum
          required: true
          short_name: magnum
          src_dir: src/opendev.org/openstack/magnum
        opendev.org/openstack/manila:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/manila
          checkout: master
          checkout_description: job override ref
          commit: 61eecb6746486d0565f4d4c62372bea6e799b31f
          name: openstack/manila
          required: true
          short_name: manila
          src_dir: src/opendev.org/openstack/manila
        opendev.org/openstack/neutron:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/neutron
          checkout: master
          checkout_description: job override ref
          commit: 41a2a5ed8aa064a8a54ffaade108d34d9b04ba62
          name: openstack/neutron
          required: true
          short_name: neutron
          src_dir: src/opendev.org/openstack/neutron
        opendev.org/openstack/nova:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/nova
          checkout: master
          checkout_description: job override ref
          commit: d5c64e7aba09052601b59bf1297187d85da6b90b
          name: openstack/nova
          required: true
          short_name: nova
          src_dir: src/opendev.org/openstack/nova
        opendev.org/openstack/octavia:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/octavia
          checkout: master
          checkout_description: job override ref
          commit: 79cf1f787fa9c03adba8575dc94324b97963f84e
          name: openstack/octavia
          required: true
          short_name: octavia
          src_dir: src/opendev.org/openstack/octavia
        opendev.org/openstack/os-test-images:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/os-test-images
          checkout: master
          checkout_description: job override ref
          commit: 5d0367e03788764f41da8effffa14e3eac513201
          name: openstack/os-test-images
          required: true
          short_name: os-test-images
          src_dir: src/opendev.org/openstack/os-test-images
        opendev.org/openstack/ovn-octavia-provider:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/ovn-octavia-provider
          checkout: master
          checkout_description: job override ref
          commit: 732466071706ef5c3e651ece1bbb16380ed4da0f
          name: openstack/ovn-octavia-provider
          required: true
          short_name: ovn-octavia-provider
          src_dir: src/opendev.org/openstack/ovn-octavia-provider
        opendev.org/openstack/placement:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/placement
          checkout: master
          checkout_description: job override ref
          commit: e3db398fba279721121892323e6260c6932797c1
          name: openstack/placement
          required: true
          short_name: placement
          src_dir: src/opendev.org/openstack/placement
        opendev.org/openstack/python-magnumclient:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/python-magnumclient
          checkout: master
          checkout_description: job override ref
          commit: 1d0385e236fc65d1b1beb0e9da46ae8df6a0947d
          name: openstack/python-magnumclient
          required: true
          short_name: python-magnumclient
          src_dir: src/opendev.org/openstack/python-magnumclient
        opendev.org/openstack/requirements:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/requirements
          checkout: master
          checkout_description: job override ref
          commit: bb067082abc8bf3676a8c7e6ae8fa91a2c84b9cb
          name: openstack/requirements
          required: true
          short_name: requirements
          src_dir: src/opendev.org/openstack/requirements
        opendev.org/openstack/swift:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/swift
          checkout: master
          checkout_description: job override ref
          commit: 178e8e2e70f8153ac27e343caec2e9391ca369a9
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/702/head
      resources: {}
      tenant: oss
      timeout: 7200
      topic: null
      voting: true
    zuul_copy_output:
      /etc/ceph: logs
      /etc/glusterfs/glusterd.vol: logs
      /etc/libvirt: logs
      /etc/lvm: logs
      /etc/resolv.conf: logs
      /etc/sudoers: logs
      /etc/sudoers.d: logs
      /var/log/ceph: logs
      /var/log/glusterfs: logs
      /var/log/libvirt: logs
      /var/log/mysql: logs
      /var/log/openvswitch: logs
      /var/log/postgresql: logs
      /var/log/rabbitmq: logs
      /var/log/unbound.log: logs
      '{{ devstack_conf_dir }}/.localrc.auto': logs
      '{{ devstack_conf_dir }}/.stackenv': logs
      '{{ devstack_conf_dir }}/local.conf': logs
      '{{ devstack_conf_dir }}/localrc': logs
      '{{ devstack_full_log}}': logs
      '{{ devstack_log_dir }}/atop': logs
      '{{ devstack_log_dir }}/devstacklog.txt': logs
      '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
      '{{ devstack_log_dir }}/dstat-csv.log': logs
      '{{ devstack_log_dir }}/qemu.coredump': logs
      '{{ devstack_log_dir }}/tcpdump.pcap': logs
      '{{ devstack_log_dir }}/worlddump-latest.txt': logs
      '{{ stage_dir }}/apache': logs
      '{{ stage_dir }}/apache_config': logs
      '{{ stage_dir }}/audit.log': logs
      '{{ stage_dir }}/core': logs
      '{{ stage_dir }}/deprecations.log': logs
      '{{ stage_dir }}/df.txt': logs
      '{{ stage_dir }}/dpkg-l.txt': logs
      '{{ stage_dir }}/etc': logs
      '{{ stage_dir }}/iptables.txt': logs
      '{{ stage_dir }}/listen53.txt': logs
      '{{ stage_dir }}/mount.txt': logs
      '{{ stage_dir }}/performance.json': logs
      '{{ stage_dir }}/pip2-freeze.txt': logs
      '{{ stage_dir }}/pip3-freeze.txt': logs
      '{{ stage_dir }}/rpm-qa.txt': logs
      '{{ stage_dir }}/services.txt': logs
      '{{ stage_dir }}/verify_tempest_conf.log': logs
