Commit 30aee4b
Cherry-pick v3.12.1 PRs from master (#2149)
* Implement nsxt_policy_virtual_network_appliance_cluster resource and datasource (#2061)
Adds resource and data source for the Virtual Network Appliance Cluster API
(/infra/sites/{siteId}/enforcement-points/{epId}/virtual-network-appliance-clusters/{id}),
including API client wrapper, CRUD logic, mock unit tests, acceptance tests, and docs.
Also adds nsxt_policy_virtual_network_appliance_cluster_realization data source which
waits for cluster and per-appliance realization and exposes vna_paths — the policy
paths of deployed VNA appliance nodes needed by downstream resources such as
nsxt_policy_route_controller_interface.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Implement nsxt_policy_virtual_network_appliance resource, data source and realization data source (#2084)
Add nsxt_policy_virtual_network_appliance resource and data source for managing
virtual network appliances within VNA clusters. Add nsxt_policy_virtual_network_appliance_realization
data source to poll per-appliance state until a terminal realization state is reached.
Consolidate VNA data source and realization data source acceptance tests within the resource
test to avoid redundant VNA deployments. Use NSXT_TEST_MGT_NETWORK for the management
interface network ID.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Implement nsxt_policy_route_controller resource and datasource (#2074)
Add resource and data source for the Route Controller API
(/infra/route-controllers/{id}) with an inline bgp_config block backed
by a single atomic H-API call.
Key implementation details:
- H-API (Infra.Patch) creates/updates RouteController and its
RouteControllerBgpRoutingConfig child atomically in one request,
mirroring the Tier-0 / transit-gateway BGP pattern.
- RouteControllerBgpRoutingConfig.Id="bgp" and ResourceType are set
explicitly so NSX can route the child correctly; omitting them caused
the "Resource type not provided for id:null" error seen previously.
- MarkedForDelete child is sent when the user removes bgp_config, so
cleanup is also atomic.
- ha_mode and virtual_network_appliance_cluster_path use OmitIfEmpty
metadata, letting SchemaToStruct skip nil-pointer serialisation that
NSX rejected with a field-validation error.
- Acceptance tests depend on nsxt_policy_virtual_network_appliance_cluster
(from the VNA branch base) rather than a hardcoded env-var path.
Signed-off-by: Kobi Samoray <kobi.samoray@broadcom.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Implement nsxt_policy_route_controller_interface resource and datasource (#2076)
Adds resource and data source for the Route Controller Interface API
(/infra/route-controllers/{rc-id}/interfaces/{interface-id}), including
API client wrapper, CRUD logic, mock unit tests, acceptance tests, and docs.
Acceptance tests use vna_paths[0] from the realization data source to supply
the required VNA appliance node path (NSX 9.2 rejects the cluster path).
Co-authored-by: Cursor <cursoragent@cursor.com>
* Implement nsxt_policy_route_controller_bgp_neighbor resource and datasource (#2075)
Adds resource and data source for the Route Controller BGP Neighbor Config API
(/infra/route-controllers/{rc-id}/bgp-neighbor-configs/{neighbor-id}), including
API client wrapper, CRUD logic, mock unit tests, acceptance tests, and docs.
Acceptance tests provision a prerequisite nsxt_policy_route_controller_interface
whose floating IP is used as source_addresses, satisfying NSX 9.2 validation.
The interface template uses vna_paths[0] from the realization data source to
supply the required VNA appliance node path.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add nsxt_policy_distributed_vxlan_connection resource and data source (#2073)
* Implement nsxt_policy_route_controller resource and datasource
Add resource and data source for the Route Controller API
(/infra/route-controllers/{id}) with an inline bgp_config block backed
by a single atomic H-API call.
Key implementation details:
- H-API (Infra.Patch) creates/updates RouteController and its
RouteControllerBgpRoutingConfig child atomically in one request,
mirroring the Tier-0 / transit-gateway BGP pattern.
- RouteControllerBgpRoutingConfig.Id="bgp" and ResourceType are set
explicitly so NSX can route the child correctly; omitting them caused
the "Resource type not provided for id:null" error seen previously.
- MarkedForDelete child is sent when the user removes bgp_config, so
cleanup is also atomic.
- ha_mode and virtual_network_appliance_cluster_path use OmitIfEmpty
metadata, letting SchemaToStruct skip nil-pointer serialisation that
NSX rejected with a field-validation error.
- Acceptance tests depend on nsxt_policy_virtual_network_appliance_cluster
(from the VNA branch base) rather than a hardcoded env-var path.
Signed-off-by: Kobi Samoray <kobi.samoray@broadcom.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add nsxt_policy_distributed_vxlan_connection resource and data source
Signed-off-by: Kobi Samoray <kobi.samoray@broadcom.com>
---------
Signed-off-by: Kobi Samoray <kobi.samoray@broadcom.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix credential drift in nsxt_policy_virtual_network_appliance (bug 3715433) (#2113)
When an Update adds the credentials block for the first time, Terraform
places the planned passwords in the diff area of ResourceData (accessible
via d.Get) but not yet in the writer. The previous setVNACredentialsInSchema
returned nil early when obj.Credentials was nil, never calling d.Set, so
the passwords were never transferred to the writer and were lost from state,
causing perpetual + credentials drift on every subsequent plan.
Fix: always call d.Set("credentials", …) when credentials are present in
d.Get("credentials"), regardless of whether obj.Credentials is nil. This
ensures passwords are written to the ResourceData writer and persisted to
state.
Add three new mock sub-tests that cover:
- Read preserves passwords when API returns nil credentials
- Read preserves passwords and populates computed usernames when API
returns a Credentials object
- Read does not inject a credentials block when none is configured
Add TestAccResourceNsxtPolicyVirtualNetworkAppliance_credentialsDrift, an
acceptance test that deploys a VNA without credentials then updates it to
add credentials, verifying the plan is a no-op after the update (the
scenario described in bug update #1).
Co-authored-by: Cursor <cursoragent@cursor.com>
* @ANS-TF-IDPS: Support BMS Group type (#2102)
+ Update Group resource with static and dynamic group mebership support for BMS
+ Add acceptance test for all cases
+ Version specific check for BMS CRUD APIs
+ Add Unit Test
+ Manual Testing
Jira: #NSEC-13749
* @ANS-TF-BMS: Add comprehensive Bare Metal Server (BMS) support to NSX-T provider (#ANSD-120216) (#2127)
+ TF Resource for BMS Server Tags
- Resource for managing tags on Bare Metal Servers
+ TF Resource for BMS Interface Tags
- Resource for managing tags on Bare Metal Server Interfaces
+ TF Data Source for BMS Server
- Data source to retrieve single BMS server by external_id or display_name
+ TF Data Source for BMS Servers
- Data source to retrieve BMS server inventory with advanced filtering
+ TF Data Source for BMS Interface
- Data source to retrieve single BMS interface by external_id or display_name
+ TF Data Source for BMS Interfaces
- Data source to retrieve BMS interface inventory with filtering
+ TF Data Source for BMS Server Tags
- Data source to retrieve existing tags on BMS servers
+ TF Data Source for BMS Interface Tags
- Data source to retrieve existing tags on BMS interfaces
+ TF Data Source for BMS Server Group Associations
- Data source to retrieve group memberships for BMS servers
+ TF Data Source for BMS Interface Group Associations
- Data source to retrieve group memberships for BMS interfaces
+ TF Data Source for BMS Server Group Members
- Data source to retrieve BMS server members of a group
+ TF Data Source for BMS Interface Group Members
- Data source to retrieve BMS interface members of a group
+ Enhanced TF Resource for Policy Groups
- Added BMS/BMSI support with group_type = "BareMetalServer"
+ Enhanced TF Resource for Security Policies
- Added BMS group support in DFW rules
+ TF acceptance tests for all new resources and data sources
+ TF unit tests for all new resources and data sources
+ TF manual tests for complete scenario coverage
+ TF documentation for all new resources and data sources
- `nsxt_policy_baremetal_server_tags` - Server tag management with CRUD operations
- `nsxt_policy_baremetal_server_interface_tags` - Interface tag management with CRUD operations
- Enhanced `nsxt_policy_group` - BMS static/dynamic group support with member types
- Enhanced `nsxt_policy_security_policy` - DFW policy integration with BMS groups
- Enhanced `nsxt_policy_security_policy_rule` - Rule-level BMS group support
- Enhanced `nsxt_policy_parent_security_policy` - Parent policy BMS integration
- `nsxt_policy_baremetal_servers` - BMS vulk server inventory with advanced filtering (regex, OS, tags, source)
- `nsxt_policy_baremetal_server` - BMS Server individual lookup by external_id/display_name
- `nsxt_policy_baremetal_server_interfaces` - BMS bulk interface inventory with comprehensive filtering
- `nsxt_policy_baremetal_server_interface` - BMS interface individual lookup by external_id/display_name
- `nsxt_policy_baremetal_server_tags` - BMS Server tag retrieval and validation
- `nsxt_policy_baremetal_server_interface_tags` - BMS Interface tag retrieval and validation
- `nsxt_policy_baremetal_server_group_associations` - BMS Server group associations for membership discovery
- `nsxt_policy_baremetal_server_interface_group_associations` - BMS Interface group associations for membership discovery
- `nsxt_policy_group_baremetal_server_members` - BMS Server group members for direct member listing
- `nsxt_policy_group_baremetal_server_interface_members` - BMS Interface group members for direct member listing
- Enhanced `nsxt_policy_security_policy` - Policy discovery with BMS group integration
BMS Resource Features:
- Complete CRUD operations for BMS server and interface tags
- Dynamic group support with all operators (EQUALS, CONTAINS, STARTSWITH, ENDSWITH, NOTEQUALS, NOTIN)
- Static group support with external_id_expression for BMS, BMSI, and mixed membership
- Nested group support with path_expression for hierarchical relationships
- DFW policy integration across all categories (Application, Infrastructure, Emergency)
- Bidirectional group membership APIs (Member→Groups AND Group→Members)
- NSX-T 9.0.0+ compatibility with version validation
- Local Manager only support
- Enhanced error messaging with troubleshooting guidance
- NSX-T Search API Integration**: Uses `/policy/api/v1/search/query` for inventory discovery
- Hybrid Filtering**: Server-side Lucene queries for tags, client-side filtering for display names/regex patterns
- Error Handling**: Comprehensive validation for duplicate display names and missing resources
Testing:
Comprehensive testing via acceptance tests, unit tests and manual testing on live NSX-T 9.0.0 setup.
BMS Test Coverage:
- 63 acceptance tests with complete lifecycle validation
- 52 unit tests with utgomock pattern covering positive, negative, and error scenarios
- 88 resources created successfully and multiple manual test phases with comprehensive scenario coverage
- Complete BMS workflow testing (inventory → tagging → grouping → DFW → associations → members)
- All supported operators and filtering capabilities tested
- Error scenario validation for unsupported features
BMS Acceptance Tests:
1. **Inventory & Discovery** (7 tests) - Server/interface discovery and advanced filtering
2. **Tagging Operations** (8 tests) - Complete CRUD lifecycle with enhanced validation
3. **Static Groups** (4 tests) - External ID and nested group patterns
4. **Dynamic Groups** (5 tests) - All operators across member types
5. **DFW Policies** (8 tests) - Complete policy integration with enhanced validation
6. **Group Associations** (6 tests) - Membership discovery and validation
7. **Group Members** (8 tests) - Direct member listing with enhanced validation
8. **Validation & Error Handling** (3 tests) - Restriction and error validation
9. **End-to-End Workflows** (3 tests) - Complete lifecycle testing with enhanced validation
10. **Comprehensive Integration** (11 tests) - Cross-component validation with parallel support
Unit Tests (52):
- **Mock-based testing** for all resources and data sources using utgomock pattern
- **Schema validation** and boundary condition testing
- **Error handling** and edge case coverage with comprehensive scenarios
- **API integration validation** with enhanced mock scenarios
Manual Testing:
- **Comprehensive scenario coverage** across all supported BMS workflows
- **Multi-environment validation** including vSphere and bare metal deployments
- **Performance testing** with large-scale server and interface inventories (1000+ entities)
- **Error scenario validation** including network failures and API rate limiting
- **Integration testing** with existing NSX-T policies and DFW rules
- **Upgrade path testing** from non-BMS to BMS-enabled configurations
Key Features Tested:
- BMS-specific field validation** with enhanced schema boundary testing and type safety
- Dynamic group operator validation** per member type (EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH)
- Static/nested group membership** with proper validation and circular dependency detection
- DFW policy integration** with BMS groups as sources/destinations in all policy categories
- Bidirectional group membership APIs** with consistency validation and enforcement point testing
- Tag data source validation** for drift detection and complete CRUD workflows
- Individual entity lookup** with enhanced existence validation and error handling for ambiguous matches
- Advanced filtering patterns** with comprehensive regex and substring matching validation
- Enhanced duplicate display name error handling** with clear resolution guidance
Key Validations:
- Group type restrictions (BareMetalServer required for BMS/BMSI members)
- Dynamic group operator support per member type
- DFW category support with GFW/IDPS restriction enforcement
- NSX version requirement validation (9.0.0+)
- Error handling for unsupported feature combinations
BMS-Specific Features:
- group_type = "BareMetalServer" requirement for groups containing BMS/BMSI members
- external_id_expression support for static membership patterns
- path_expression support for nested group hierarchies
- Dynamic group operators matching NSX-T API capabilities per member type
- DFW policy integration maintaining existing behavior with BMS enhancement
- Bidirectional APIs for complete association analysis
- Advanced filtering capabilities with comprehensive validation
- Enhanced operational monitoring with troubleshooting attributes
Testing Environment:
- NSX-T Version: 9.0.0+
- Provider Version: >=3.12.0
- Infrastructure: Local Manager only (Federation and Multi-tenancy not supported for BMS)
JIRA: #ANSD-120216
* Some essientials to make cherry-picks work
Remove some redundant code, fix linter issues and update the SDK version to the required one.
Signed-off-by: Kobi Samoray <kobi.samoray@broadcom.com>
* fix(nsxt_policy_route_controller): mark virtual_network_appliance_cluster_path as Required (#2144)
The NSX API enforces virtual_network_appliance_cluster_path as a required
field on RouteController objects (error code 255: required property missing),
but the Terraform schema declared it Optional. This caused apply to fail at
the API layer with no prior Terraform-level validation.
- Change schema attribute from Optional to Required
- Remove OmitIfEmpty from metadata (not applicable to required fields)
- Update docs and example usage to reflect the requirement
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(nsxt_policy_route_controller_interface): mark interface_address as Required (#2146)
The NSX API enforces interface_address as a required field on
RouteControllerInterface objects (error code 255: required property missing),
but the Terraform schema declared it Optional. This caused apply to fail at
the API layer with no prior Terraform-level validation.
- Change interface_address from Optional to Required with MinItems: 1
- Update docs to reflect the requirement
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Signed-off-by: Kobi Samoray <kobi.samoray@broadcom.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: bgujar <bhagyashree.gujar@broadcom.com>
Co-authored-by: Priyanka Singh <priyanka1.singh@broadcom.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>1 parent 392b144 commit 30aee4b
101 files changed
Lines changed: 16846 additions & 134 deletions
File tree
- api/infra
- domains/groups
- sites/enforcement_points
- docs
- data-sources
- guides
- resources
- nsxt
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
Lines changed: 45 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
Lines changed: 44 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
0 commit comments