Commit ed4a4f2
feat: Add version tracking to FeatureView (#6101)
* feat: Add version tracking to FeatureView, StreamFeatureView, and OnDemandFeatureView
Every `feast apply` now creates a version snapshot. Users can pin a
feature view to a specific historical version declaratively via
`version="v2"`. By default, the latest version is always served.
- New proto: FeatureViewVersion.proto with version record/history
- Added `version` field to FeatureViewSpec, StreamFeatureViewSpec,
OnDemandFeatureViewSpec and version metadata to their Meta messages
- New version_utils module for parsing/normalizing version strings
- Version-aware apply_feature_view in both SQL and file registries
- New `list_feature_view_versions` API on FeatureStore and registries
- CLI: `feast feature-views versions <name>` subcommand
- Updated all 14 templates with explicit `version="latest"`
- Unit tests (28) and integration tests (7) for versioning
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address PR review feedback from Devin
- Fix current_version_number=0 being silently dropped during proto
deserialization in FeatureView, OnDemandFeatureView (proto3 int32
default 0 is falsy in Python); use spec.version to disambiguate
- Add current_version_number restoration in StreamFeatureView.from_proto
(was missing entirely)
- Use timezone-aware UTC datetime in SqlRegistry.list_feature_view_versions
for consistency with the rest of the codebase
- Add test for v0 proto roundtrip
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: Add feature view versioning documentation
- Add Versioning section to feature-view.md concept page covering
automatic snapshots, version pinning, version string formats,
CLI usage, and Python SDK API
- Add `feast feature-views versions` command to CLI reference
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address second round of PR review feedback from Devin
- Fix current_version_number roundtrip bug: version="latest" (always
truthy) caused None to become 0 after proto roundtrip; now check
that spec.version is not "latest" before treating 0 as intentional
- Use write_engine (not read_engine) for pre/post apply reads in
SqlRegistry to avoid read replica lag causing missed version snapshots
- Remove redundant version check in StreamFeatureView.__eq__ (parent
FeatureView.__eq__ already checks it)
- Add else clause to StreamFeatureView.from_proto for consistency
- Add test for latest/None roundtrip preservation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Clean up version history on delete and use write_engine consistently
- delete_feature_view now also deletes version history records,
preventing IntegrityError when re-creating a previously deleted FV
- _get_next_version_number uses write_engine instead of read_engine
to avoid stale version numbers with read replicas
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: Clarify versioning auto-increment behavior and pin/revert flow
- Add step-by-step walkthrough showing how versions auto-increment
on changes and skip on identical re-applies
- Add CLI example showing the apply/change/apply cycle
- Clarify that pinning ignores constructor params and uses the snapshot
- Explain how to return to auto-incrementing after a pin/revert
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Add pin conflict detection to both file and SQL registries
Raises FeatureViewPinConflict when a user pins to an older version
while also modifying the feature view definition (schema, source, etc.).
Fixes FeatureView.__copy__() to include description and owner fields,
which was causing false positive conflict detection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address Devin review feedback on versioning
- Add version parameter to BatchFeatureView constructor for consistency
with FeatureView, StreamFeatureView, and OnDemandFeatureView
- Clean up version history records in file registry delete_feature_view
to prevent orphaned records on re-creation
- Fix current_version_number proto roundtrip: preserve 0 when
version="latest" (after first apply) instead of incorrectly returning
None
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: Document concurrent multi-version serving limitations
Clarify that versioning provides definition management and rollback,
not concurrent multi-version serving. Document recommended approaches
(separate projects or distinct FV names) for A/B testing scenarios.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Implement version-qualified feature references (@v<N>)
Extends feature view versioning with support for reading features from specific
versions at query time using the syntax: "driver_stats@v2:trips_today"
Core changes:
- Add _parse_feature_ref() to parse version-qualified feature references
- Update all feature reference parsing to use _parse_feature_ref()
- Add get_feature_view_by_version() to BaseRegistry and all implementations
- Add FeatureViewProjection.version_tag for multi-version query support
- Add version-aware _table_id() in SQLite online store (v0→unversioned, v1+→_v{N})
- Add VersionedOnlineReadNotSupported error for unsupported stores
Features:
- "driver_stats:trips" = "driver_stats@latest:trips" (backward compatible)
- "driver_stats@v2:trips" reads from v2 snapshot using _v2 table suffix
- Multiple versions in same query: ["driver@v1:trips", "driver@v2:daily"]
- Version parameter added to all decorator functions for consistency
Backward compatibility:
- Unversioned table serves as v0, only v1+ get _v{N} suffix
- All existing queries work unchanged
- SQLite-only for now, other stores raise clear error
Documentation:
- Updated feature-view.md with @Version syntax examples
- Updated feature-retrieval.md reference format
- Added version examples to how-to guides
Tests: 47 unit + 11 integration tests pass, no regressions
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix: Resolve mypy type errors in proto_registry_utils.py
- Fix type inference issues in get_feature_view_by_version()
- Use distinct variable names for different proto types
- Ensure proper type annotations for BaseFeatureView subclasses
* feat: Add version metadata to clean @v2 syntax from feature names
Implement optional feature view version metadata in API responses to address
the issue where internal @v2 version syntax was leaking into client responses.
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix: Update provider implementations with version metadata parameter
Add missing include_feature_view_version_metadata parameter to:
- EmbeddedGoOnlineFeaturesService.get_online_features()
- FooProvider.get_online_features() and get_online_features_async()
- FooProvider.retrieve_online_documents() and retrieve_online_documents_v2()
This resolves CI failures where provider implementations were not updated
with the new parameter from the abstract Provider interface.
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix: Add version metadata parameter to all online store implementations
Add missing include_feature_view_version_metadata parameter to:
- SqliteOnlineStore.retrieve_online_documents/v2
- FaissOnlineStore.retrieve_online_documents
- QdrantOnlineStore.retrieve_online_documents
- MilvusOnlineStore.retrieve_online_documents_v2
- RemoteOnlineStore.retrieve_online_documents/v2
- PostgresOnlineStore.retrieve_online_documents/v2
- ElasticsearchOnlineStore.retrieve_online_documents/v2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Resolve mypy type errors in versioning code
- Fix _schema_or_udf_changed overrides to accept BaseFeatureView
parameter type, satisfying Liskov substitution principle. Each
subclass narrows via isinstance check in the method body.
- Use getattr for __code__ access on UDF in StreamFeatureView to
handle MethodType correctly.
- Change _update_metadata_fields proto parameter from Message to Any
since the method accesses .spec and .meta attributes.
- Guard BaseFeatureView attribute access (online, offline, etc.) with
hasattr checks in _update_metadata_fields.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address Devin review feedback on versioning
- Fix version-qualified features dropped with full_feature_names=True:
use _parse_feature_ref to build clean requested_result_row_names
- Fix retrieve_online_documents breaking with @vn refs: use
_parse_feature_ref instead of split(":") for FV name extraction
- Fix metadata-only updates not committed: add self.commit() after
_update_metadata_fields in file registry
- Fix ODFV transforms broken by version-qualified refs: use
_parse_feature_ref in _augment_response_with_on_demand_transforms
- Fix _update_metadata_fields not updating spec.version: add version
field update so pinned-to-latest transitions persist
- Fix _resolve_feature_counts inflating FV count: strip @vn from
feature view names in metrics
- Fix version snapshots storing stale current_version_number: set
version number before serializing snapshot in both file and SQL
registries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address additional Devin review feedback
- Set spec.project on snapshot protos in SqlRegistry before
serializing, so version snapshots include the correct project field
- Fix _check_versioned_read_support to check projection.version_tag
instead of current_version_number, so explicitly version-qualified
reads (@v0) are correctly rejected on non-SQLite stores
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Make feature view versioning opt-in via registry config
Versioning was always active on every `feast apply`. This adds an
`enable_feature_view_versioning` boolean (default False) to
RegistryConfig so version history, version pins, and version-qualified
refs are only available when explicitly enabled. Existing behaviour is
fully preserved when the flag is set to true.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address Devin review feedback on versioning issues
- Fix SQLite _table_id to prefer projection.version_tag over
current_version_number so @v2 refs read from the correct table
- Detect feature name collisions for multi-version queries with
full_feature_names=True (e.g. fv@v1:feat vs fv@v2:feat)
- Remove unused include_feature_view_version_metadata parameter from
retrieve_online_documents (v1) across all providers and online stores
- Remove redundant name check from _schema_or_udf_changed since callers
always match by name first
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Preserve version tag in response column names for multi-version queries
When version-qualified refs (e.g. fv@v1:feat, fv@v2:feat) are used,
include the version tag in full_feature_names output so multi-version
queries produce distinct columns (fv@v1__feat vs fv@v2__feat). Also
fix proto roundtrip test to match -1 sentinel behavior.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Handle version race conditions gracefully with retry and forward declaration
Auto-increment path (version="latest") now retries up to 3 times on
IntegrityError in the SQL registry when concurrent applies race on the
same version number. Explicit version path (version="v<N>") now creates
the version if it doesn't exist (forward declaration) instead of raising
FeatureViewVersionNotFound, with ConcurrentVersionConflict on race.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Gate feature services that reference versioned feature views
Fail fast at apply time and retrieval time when a feature service
references a versioned FV (current_version_number > 0) and
enable_online_feature_view_versioning is off.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Resolve mypy errors and rename config field for clarity
Rename enable_feature_view_versioning -> enable_online_feature_view_versioning
to clarify that it controls online reads, not version history tracking.
Fix mypy type narrowing issues with current_version_number (int | None)
and variable redefinition in feature_store.py. Remove -1 sentinel from
proto serialization in favor of treating proto default 0 without
spec.version as None.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Enable feature service serving for versioned feature views
When enable_online_feature_view_versioning is on and a FeatureService
references a versioned FV, set version_tag on the projection so that
online reads resolve to the correct versioned table. Previously the
FeatureService path never set version_tag, causing reads from the
wrong (unversioned) online store table.
Changes:
- _get_features(): version-qualify feature refs for FeatureService projections
- _get_feature_views_to_use(): capture current_version_number before
with_projection() discards it, then set version_tag on the projection
- feature_store.py: fix mypy type narrowing for the gate check
- Add integration tests for both code paths
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: Update RFC for feature service support and rename CLI command
Update the Feature Services section in the RFC to reflect that feature
services now correctly serve versioned FVs when the online versioning
flag is enabled (automatic version_tag resolution on projections).
Rename CLI command from `feast feature-views versions` to
`feast feature-views list-versions` for consistency, and update all
docs references.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(ui): Add version display and Versions tab to feature view pages
Show current version badge in feature view headers and listing table,
and add a Versions tab with expandable version history across all
feature view types (Regular, Stream, OnDemand).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style(ui): Fix prettier formatting in feature view components
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* updated utcnow
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
* feat: Add version-aware materialization support
Add --version flag to feast materialize/materialize-incremental CLI commands
and corresponding Python SDK support. Gate versioned table IDs behind
enable_online_feature_view_versioning config flag in SQLite online store.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Resolve three versioning regressions from review feedback
1. Stop injecting version_tag on FeatureService projections in utils.py,
which was causing non-SQLite stores to reject FeatureService reads
when versioning was enabled.
2. Persist version_tag in FeatureViewProjection proto (field 10) so it
survives registry round-trips.
3. Fix _update_metadata_fields() to reset current_version_number to 0
when unpinning a feature view back to version="latest".
Update tests to match new behavior and add test_unpin_from_versioned_to_latest.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Add --no-promote flag to feast apply and fix versioned ref parsing
Add --no-promote flag that saves new version snapshots without promoting
them to active, enabling phased rollouts without a transition window
where unversioned consumers briefly see the new schema.
Also audit and fix brittle feature reference parsing across the codebase
to properly handle @v<N> version-qualified syntax:
- Fix ibis offline store prefix matching to use name_to_use()
- Fix Go ParseFeatureReference to strip @v<N> from view name
- Fix passthrough_provider saved dataset column naming
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
* docs: Consolidate versioning docs into alpha reference page
Move detailed versioning documentation from the concepts page into the
alpha reference page to avoid duplication. The concepts page now has a
brief summary with a link to the full reference.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
* docs: Add no_promote to apply_diff_to_registry docstring
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
* fix: Reject reserved chars in FV names and make version parser resilient
Block `@` and `:` in feature view names via ensure_valid() to prevent
ambiguous version-qualified reference parsing. Make _parse_feature_ref()
fall back gracefully for legacy FV names containing `@` instead of
raising, and update Go's ParseFeatureReference to only strip `@` suffixes
matching `v<N>`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Add ensure_valid() call in Snowflake registry apply_feature_view
The Snowflake registry was missing the ensure_valid() call that other
registry implementations (SQL, Cask) already perform before applying a
feature view. This ensures name validation (including reserved character
rejection) runs consistently across all registry backends.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Make version_tag optional in proto and use HasField() for correct zero-value handling
The proto field `version_tag` was a plain `int32`, making 0 and "not set"
indistinguishable. Changed to `optional int32` so `HasField()` works
correctly, and updated `FeatureViewProjection.from_proto` to use it
instead of `> 0` which silently dropped version_tag=0.
Also removes dead issue link from VersionedOnlineReadNotSupported error.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address versioning review feedback (Snowflake, Go server, SQL registry)
- Snowflake registry: raise NotImplementedError when no_promote=True
since versioning is not supported
- Go feature server: return error on versioned refs (@vn) instead of
silently stripping the version and serving unversioned data
- SQL registry: inline delete logic in delete_feature_view so the FV
delete and version history cleanup run in a single transaction,
preventing orphaned rows on partial failure
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Handle @latest in Go feature server and pre-compile version regex
- Strip @latest suffix (equivalent to no version) instead of passing
through as part of the FV name, which caused confusing "not found" errors
- Pre-compile version tag regex to package-level var to avoid recompilation
on every call in the hot path
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent 1ac865e commit ed4a4f2
File tree
96 files changed
+5947
-1108
lines changed- docs
- getting-started/concepts
- how-to-guides/feast-snowflake-gcp-aws
- reference
- registries
- rfcs
- go/internal/feast/onlineserving
- protos/feast
- core
- serving
- sdk/python
- feast
- cli
- diff
- embedded_go
- infra
- offline_stores
- contrib/oracle_offline_store
- online_stores
- elasticsearch_online_store
- milvus_online_store
- postgres_online_store
- registry
- protos/feast
- core
- serving
- templates
- athena/feature_repo
- aws/feature_repo
- cassandra/feature_repo
- couchbase/feature_repo
- gcp/feature_repo
- hazelcast/feature_repo
- hbase/feature_repo
- local/feature_repo
- milvus/feature_repo
- postgres/feature_repo
- pytorch_nlp/feature_repo
- ray/feature_repo
- snowflake/feature_repo
- spark/feature_repo
- tests
- integration/registration
- unit
- ui
- public
- src/pages/feature-views
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
96 files changed
+5947
-1108
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
166 | 166 | | |
167 | 167 | | |
168 | 168 | | |
| 169 | + | |
169 | 170 | | |
170 | 171 | | |
171 | 172 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
81 | | - | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
82 | 84 | | |
83 | 85 | | |
84 | 86 | | |
85 | 87 | | |
86 | 88 | | |
87 | 89 | | |
88 | | - | |
89 | | - | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
90 | 94 | | |
91 | 95 | | |
92 | 96 | | |
| |||
95 | 99 | | |
96 | 100 | | |
97 | 101 | | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
98 | 106 | | |
99 | 107 | | |
100 | 108 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
163 | 182 | | |
164 | 183 | | |
165 | 184 | | |
| |||
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| |||
Lines changed: 3 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
25 | 27 | | |
26 | 28 | | |
27 | 29 | | |
| |||
| 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 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
176 | 176 | | |
177 | 177 | | |
178 | 178 | | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
179 | 191 | | |
180 | 192 | | |
181 | 193 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| |||
0 commit comments