userplex 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/README.md +15 -27
  4. data/lib/userplex/client.rb +3 -12
  5. data/lib/userplex/internal/transport/base_client.rb +0 -6
  6. data/lib/userplex/models/log_batch_params.rb +57 -0
  7. data/lib/userplex/models/log_batch_response.rb +16 -0
  8. data/lib/userplex/models/log_new_params.rb +46 -0
  9. data/lib/userplex/models/log_new_response.rb +16 -0
  10. data/lib/userplex/models/user_identify_params.rb +14 -14
  11. data/lib/userplex/models/user_identify_response.rb +1 -2
  12. data/lib/userplex/models.rb +4 -0
  13. data/lib/userplex/resources/logs.rb +60 -0
  14. data/lib/userplex/resources/users.rb +6 -9
  15. data/lib/userplex/version.rb +1 -1
  16. data/lib/userplex.rb +5 -1
  17. data/rbi/userplex/client.rbi +2 -7
  18. data/rbi/userplex/internal/transport/base_client.rbi +0 -5
  19. data/rbi/userplex/models/log_batch_params.rbi +113 -0
  20. data/rbi/userplex/models/log_batch_response.rbi +23 -0
  21. data/rbi/userplex/models/log_new_params.rbi +76 -0
  22. data/rbi/userplex/models/log_new_response.rbi +23 -0
  23. data/rbi/userplex/models/user_identify_params.rbi +17 -17
  24. data/rbi/userplex/models/user_identify_response.rbi +1 -5
  25. data/rbi/userplex/models.rbi +4 -0
  26. data/rbi/userplex/resources/logs.rbi +47 -0
  27. data/rbi/userplex/resources/users.rbi +6 -8
  28. data/sig/userplex/client.rbs +1 -3
  29. data/sig/userplex/internal/transport/base_client.rbs +0 -2
  30. data/sig/userplex/models/log_batch_params.rbs +66 -0
  31. data/sig/userplex/models/log_batch_response.rbs +13 -0
  32. data/sig/userplex/models/log_new_params.rbs +47 -0
  33. data/sig/userplex/models/log_new_response.rbs +13 -0
  34. data/sig/userplex/models/user_identify_params.rbs +8 -8
  35. data/sig/userplex/models.rbs +4 -0
  36. data/sig/userplex/resources/logs.rbs +20 -0
  37. data/sig/userplex/resources/users.rbs +1 -1
  38. metadata +17 -5
  39. data/lib/userplex/resources/events.rb +0 -14
  40. data/rbi/userplex/resources/events.rbi +0 -12
  41. data/sig/userplex/resources/events.rbs +0 -7
@@ -0,0 +1,23 @@
1
+ # typed: strong
2
+
3
+ module Userplex
4
+ module Models
5
+ class LogBatchResponse < Userplex::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(Userplex::Models::LogBatchResponse, Userplex::Internal::AnyHash)
9
+ end
10
+
11
+ sig { returns(T::Boolean) }
12
+ attr_accessor :success
13
+
14
+ sig { params(success: T::Boolean).returns(T.attached_class) }
15
+ def self.new(success:)
16
+ end
17
+
18
+ sig { override.returns({ success: T::Boolean }) }
19
+ def to_hash
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,76 @@
1
+ # typed: strong
2
+
3
+ module Userplex
4
+ module Models
5
+ class LogNewParams < Userplex::Internal::Type::BaseModel
6
+ extend Userplex::Internal::Type::RequestParameters::Converter
7
+ include Userplex::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(Userplex::LogNewParams, Userplex::Internal::AnyHash)
12
+ end
13
+
14
+ # Log name
15
+ sig { returns(String) }
16
+ attr_accessor :name
17
+
18
+ # Additional log data
19
+ sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
20
+ attr_reader :data
21
+
22
+ sig { params(data: T::Hash[Symbol, T.anything]).void }
23
+ attr_writer :data
24
+
25
+ # Log timestamp (ISO 8601)
26
+ sig { returns(T.nilable(Time)) }
27
+ attr_reader :timestamp
28
+
29
+ sig { params(timestamp: Time).void }
30
+ attr_writer :timestamp
31
+
32
+ # External user ID
33
+ sig { returns(T.nilable(String)) }
34
+ attr_reader :user_id
35
+
36
+ sig { params(user_id: String).void }
37
+ attr_writer :user_id
38
+
39
+ sig do
40
+ params(
41
+ name: String,
42
+ data: T::Hash[Symbol, T.anything],
43
+ timestamp: Time,
44
+ user_id: String,
45
+ request_options: Userplex::RequestOptions::OrHash
46
+ ).returns(T.attached_class)
47
+ end
48
+ def self.new(
49
+ # Log name
50
+ name:,
51
+ # Additional log data
52
+ data: nil,
53
+ # Log timestamp (ISO 8601)
54
+ timestamp: nil,
55
+ # External user ID
56
+ user_id: nil,
57
+ request_options: {}
58
+ )
59
+ end
60
+
61
+ sig do
62
+ override.returns(
63
+ {
64
+ name: String,
65
+ data: T::Hash[Symbol, T.anything],
66
+ timestamp: Time,
67
+ user_id: String,
68
+ request_options: Userplex::RequestOptions
69
+ }
70
+ )
71
+ end
72
+ def to_hash
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,23 @@
1
+ # typed: strong
2
+
3
+ module Userplex
4
+ module Models
5
+ class LogNewResponse < Userplex::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(Userplex::Models::LogNewResponse, Userplex::Internal::AnyHash)
9
+ end
10
+
11
+ sig { returns(T::Boolean) }
12
+ attr_accessor :success
13
+
14
+ sig { params(success: T::Boolean).returns(T.attached_class) }
15
+ def self.new(success:)
16
+ end
17
+
18
+ sig { override.returns({ success: T::Boolean }) }
19
+ def to_hash
20
+ end
21
+ end
22
+ end
23
+ end
@@ -11,49 +11,49 @@ module Userplex
11
11
  T.any(Userplex::UserIdentifyParams, Userplex::Internal::AnyHash)
12
12
  end
13
13
 
14
- # Unique identifier for the user
14
+ # External user ID
15
15
  sig { returns(String) }
16
16
  attr_accessor :user_id
17
17
 
18
- # User email address
18
+ # Additional user attributes
19
+ sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
20
+ attr_reader :attributes
21
+
22
+ sig { params(attributes: T::Hash[Symbol, T.anything]).void }
23
+ attr_writer :attributes
24
+
25
+ # User email
19
26
  sig { returns(T.nilable(String)) }
20
27
  attr_reader :email
21
28
 
22
29
  sig { params(email: String).void }
23
30
  attr_writer :email
24
31
 
25
- # User full name
32
+ # User name
26
33
  sig { returns(T.nilable(String)) }
27
34
  attr_reader :name
28
35
 
29
36
  sig { params(name: String).void }
30
37
  attr_writer :name
31
38
 
32
- # Additional user properties
33
- sig { returns(T.nilable(T::Hash[Symbol, T.nilable(T.anything)])) }
34
- attr_reader :properties
35
-
36
- sig { params(properties: T::Hash[Symbol, T.nilable(T.anything)]).void }
37
- attr_writer :properties
38
-
39
39
  sig do
40
40
  params(
41
41
  user_id: String,
42
+ attributes: T::Hash[Symbol, T.anything],
42
43
  email: String,
43
44
  name: String,
44
- properties: T::Hash[Symbol, T.nilable(T.anything)],
45
45
  request_options: Userplex::RequestOptions::OrHash
46
46
  ).returns(T.attached_class)
47
47
  end
48
48
  def self.new(
49
- # Unique identifier for the user
49
+ # External user ID
50
50
  user_id:,
51
- # User email address
51
+ # Additional user attributes
52
+ attributes: nil,
53
+ # User email
52
54
  email: nil,
53
- # User full name
55
+ # User name
54
56
  name: nil,
55
- # Additional user properties
56
- properties: nil,
57
57
  request_options: {}
58
58
  )
59
59
  end
@@ -62,9 +62,9 @@ module Userplex
62
62
  override.returns(
63
63
  {
64
64
  user_id: String,
65
+ attributes: T::Hash[Symbol, T.anything],
65
66
  email: String,
66
67
  name: String,
67
- properties: T::Hash[Symbol, T.nilable(T.anything)],
68
68
  request_options: Userplex::RequestOptions
69
69
  }
70
70
  )
@@ -11,15 +11,11 @@ module Userplex
11
11
  )
12
12
  end
13
13
 
14
- # Operation success status
15
14
  sig { returns(T::Boolean) }
16
15
  attr_accessor :success
17
16
 
18
17
  sig { params(success: T::Boolean).returns(T.attached_class) }
19
- def self.new(
20
- # Operation success status
21
- success:
22
- )
18
+ def self.new(success:)
23
19
  end
24
20
 
25
21
  sig { override.returns({ success: T::Boolean }) }
@@ -1,5 +1,9 @@
1
1
  # typed: strong
2
2
 
3
3
  module Userplex
4
+ LogBatchParams = Userplex::Models::LogBatchParams
5
+
6
+ LogNewParams = Userplex::Models::LogNewParams
7
+
4
8
  UserIdentifyParams = Userplex::Models::UserIdentifyParams
5
9
  end
@@ -0,0 +1,47 @@
1
+ # typed: strong
2
+
3
+ module Userplex
4
+ module Resources
5
+ class Logs
6
+ sig do
7
+ params(
8
+ body: T::Array[Userplex::LogBatchParams::Body::OrHash],
9
+ request_options: Userplex::RequestOptions::OrHash
10
+ ).returns(Userplex::Models::LogBatchResponse)
11
+ end
12
+ def batch(
13
+ # A list of logs to ingest
14
+ body: nil,
15
+ request_options: {}
16
+ )
17
+ end
18
+
19
+ sig do
20
+ params(
21
+ name: String,
22
+ data: T::Hash[Symbol, T.anything],
23
+ timestamp: Time,
24
+ user_id: String,
25
+ request_options: Userplex::RequestOptions::OrHash
26
+ ).returns(Userplex::Models::LogNewResponse)
27
+ end
28
+ def new(
29
+ # Log name
30
+ name:,
31
+ # Additional log data
32
+ data: nil,
33
+ # Log timestamp (ISO 8601)
34
+ timestamp: nil,
35
+ # External user ID
36
+ user_id: nil,
37
+ request_options: {}
38
+ )
39
+ end
40
+
41
+ # @api private
42
+ sig { params(client: Userplex::Client).returns(T.attached_class) }
43
+ def self.new(client:)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -3,26 +3,24 @@
3
3
  module Userplex
4
4
  module Resources
5
5
  class Users
6
- # Creates or updates an end user in InstantDB with the provided information.
7
- # Requires a valid API key for authentication.
8
6
  sig do
9
7
  params(
10
8
  user_id: String,
9
+ attributes: T::Hash[Symbol, T.anything],
11
10
  email: String,
12
11
  name: String,
13
- properties: T::Hash[Symbol, T.nilable(T.anything)],
14
12
  request_options: Userplex::RequestOptions::OrHash
15
13
  ).returns(Userplex::Models::UserIdentifyResponse)
16
14
  end
17
15
  def identify(
18
- # Unique identifier for the user
16
+ # External user ID
19
17
  user_id:,
20
- # User email address
18
+ # Additional user attributes
19
+ attributes: nil,
20
+ # User email
21
21
  email: nil,
22
- # User full name
22
+ # User name
23
23
  name: nil,
24
- # Additional user properties
25
- properties: nil,
26
24
  request_options: {}
27
25
  )
28
26
  end
@@ -12,9 +12,7 @@ module Userplex
12
12
 
13
13
  attr_reader users: Userplex::Resources::Users
14
14
 
15
- attr_reader events: Userplex::Resources::Events
16
-
17
- private def auth_headers: -> ::Hash[String, String]
15
+ attr_reader logs: Userplex::Resources::Logs
18
16
 
19
17
  def initialize: (
20
18
  ?api_key: String?,
@@ -85,8 +85,6 @@ module Userplex
85
85
  ?idempotency_header: String?
86
86
  ) -> void
87
87
 
88
- private def auth_headers: -> ::Hash[String, String]
89
-
90
88
  private def user_agent: -> String
91
89
 
92
90
  private def generate_idempotency_key: -> String
@@ -0,0 +1,66 @@
1
+ module Userplex
2
+ module Models
3
+ type log_batch_params =
4
+ { body: ::Array[Userplex::LogBatchParams::Body] }
5
+ & Userplex::Internal::Type::request_parameters
6
+
7
+ class LogBatchParams < Userplex::Internal::Type::BaseModel
8
+ extend Userplex::Internal::Type::RequestParameters::Converter
9
+ include Userplex::Internal::Type::RequestParameters
10
+
11
+ attr_reader body: ::Array[Userplex::LogBatchParams::Body]?
12
+
13
+ def body=: (
14
+ ::Array[Userplex::LogBatchParams::Body]
15
+ ) -> ::Array[Userplex::LogBatchParams::Body]
16
+
17
+ def initialize: (
18
+ ?body: ::Array[Userplex::LogBatchParams::Body],
19
+ ?request_options: Userplex::request_opts
20
+ ) -> void
21
+
22
+ def to_hash: -> {
23
+ body: ::Array[Userplex::LogBatchParams::Body],
24
+ request_options: Userplex::RequestOptions
25
+ }
26
+
27
+ type body =
28
+ {
29
+ name: String,
30
+ data: ::Hash[Symbol, top],
31
+ timestamp: Time,
32
+ user_id: String
33
+ }
34
+
35
+ class Body < Userplex::Internal::Type::BaseModel
36
+ attr_accessor name: String
37
+
38
+ attr_reader data: ::Hash[Symbol, top]?
39
+
40
+ def data=: (::Hash[Symbol, top]) -> ::Hash[Symbol, top]
41
+
42
+ attr_reader timestamp: Time?
43
+
44
+ def timestamp=: (Time) -> Time
45
+
46
+ attr_reader user_id: String?
47
+
48
+ def user_id=: (String) -> String
49
+
50
+ def initialize: (
51
+ name: String,
52
+ ?data: ::Hash[Symbol, top],
53
+ ?timestamp: Time,
54
+ ?user_id: String
55
+ ) -> void
56
+
57
+ def to_hash: -> {
58
+ name: String,
59
+ data: ::Hash[Symbol, top],
60
+ timestamp: Time,
61
+ user_id: String
62
+ }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ module Userplex
2
+ module Models
3
+ type log_batch_response = { success: bool }
4
+
5
+ class LogBatchResponse < Userplex::Internal::Type::BaseModel
6
+ attr_accessor success: bool
7
+
8
+ def initialize: (success: bool) -> void
9
+
10
+ def to_hash: -> { success: bool }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,47 @@
1
+ module Userplex
2
+ module Models
3
+ type log_new_params =
4
+ {
5
+ name: String,
6
+ data: ::Hash[Symbol, top],
7
+ timestamp: Time,
8
+ user_id: String
9
+ }
10
+ & Userplex::Internal::Type::request_parameters
11
+
12
+ class LogNewParams < Userplex::Internal::Type::BaseModel
13
+ extend Userplex::Internal::Type::RequestParameters::Converter
14
+ include Userplex::Internal::Type::RequestParameters
15
+
16
+ attr_accessor name: String
17
+
18
+ attr_reader data: ::Hash[Symbol, top]?
19
+
20
+ def data=: (::Hash[Symbol, top]) -> ::Hash[Symbol, top]
21
+
22
+ attr_reader timestamp: Time?
23
+
24
+ def timestamp=: (Time) -> Time
25
+
26
+ attr_reader user_id: String?
27
+
28
+ def user_id=: (String) -> String
29
+
30
+ def initialize: (
31
+ name: String,
32
+ ?data: ::Hash[Symbol, top],
33
+ ?timestamp: Time,
34
+ ?user_id: String,
35
+ ?request_options: Userplex::request_opts
36
+ ) -> void
37
+
38
+ def to_hash: -> {
39
+ name: String,
40
+ data: ::Hash[Symbol, top],
41
+ timestamp: Time,
42
+ user_id: String,
43
+ request_options: Userplex::RequestOptions
44
+ }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,13 @@
1
+ module Userplex
2
+ module Models
3
+ type log_new_response = { success: bool }
4
+
5
+ class LogNewResponse < Userplex::Internal::Type::BaseModel
6
+ attr_accessor success: bool
7
+
8
+ def initialize: (success: bool) -> void
9
+
10
+ def to_hash: -> { success: bool }
11
+ end
12
+ end
13
+ end
@@ -3,9 +3,9 @@ module Userplex
3
3
  type user_identify_params =
4
4
  {
5
5
  user_id: String,
6
+ attributes: ::Hash[Symbol, top],
6
7
  email: String,
7
- name: String,
8
- properties: ::Hash[Symbol, top?]
8
+ name: String
9
9
  }
10
10
  & Userplex::Internal::Type::request_parameters
11
11
 
@@ -15,6 +15,10 @@ module Userplex
15
15
 
16
16
  attr_accessor user_id: String
17
17
 
18
+ attr_reader attributes: ::Hash[Symbol, top]?
19
+
20
+ def attributes=: (::Hash[Symbol, top]) -> ::Hash[Symbol, top]
21
+
18
22
  attr_reader email: String?
19
23
 
20
24
  def email=: (String) -> String
@@ -23,23 +27,19 @@ module Userplex
23
27
 
24
28
  def name=: (String) -> String
25
29
 
26
- attr_reader properties: ::Hash[Symbol, top?]?
27
-
28
- def properties=: (::Hash[Symbol, top?]) -> ::Hash[Symbol, top?]
29
-
30
30
  def initialize: (
31
31
  user_id: String,
32
+ ?attributes: ::Hash[Symbol, top],
32
33
  ?email: String,
33
34
  ?name: String,
34
- ?properties: ::Hash[Symbol, top?],
35
35
  ?request_options: Userplex::request_opts
36
36
  ) -> void
37
37
 
38
38
  def to_hash: -> {
39
39
  user_id: String,
40
+ attributes: ::Hash[Symbol, top],
40
41
  email: String,
41
42
  name: String,
42
- properties: ::Hash[Symbol, top?],
43
43
  request_options: Userplex::RequestOptions
44
44
  }
45
45
  end
@@ -1,3 +1,7 @@
1
1
  module Userplex
2
+ class LogBatchParams = Userplex::Models::LogBatchParams
3
+
4
+ class LogNewParams = Userplex::Models::LogNewParams
5
+
2
6
  class UserIdentifyParams = Userplex::Models::UserIdentifyParams
3
7
  end
@@ -0,0 +1,20 @@
1
+ module Userplex
2
+ module Resources
3
+ class Logs
4
+ def batch: (
5
+ ?body: ::Array[Userplex::LogBatchParams::Body],
6
+ ?request_options: Userplex::request_opts
7
+ ) -> Userplex::Models::LogBatchResponse
8
+
9
+ def new: (
10
+ name: String,
11
+ ?data: ::Hash[Symbol, top],
12
+ ?timestamp: Time,
13
+ ?user_id: String,
14
+ ?request_options: Userplex::request_opts
15
+ ) -> Userplex::Models::LogNewResponse
16
+
17
+ def initialize: (client: Userplex::Client) -> void
18
+ end
19
+ end
20
+ end
@@ -3,9 +3,9 @@ module Userplex
3
3
  class Users
4
4
  def identify: (
5
5
  user_id: String,
6
+ ?attributes: ::Hash[Symbol, top],
6
7
  ?email: String,
7
8
  ?name: String,
8
- ?properties: ::Hash[Symbol, top?],
9
9
  ?request_options: Userplex::request_opts
10
10
  ) -> Userplex::Models::UserIdentifyResponse
11
11
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: userplex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Userplex
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-19 00:00:00.000000000 Z
11
+ date: 2025-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -55,10 +55,14 @@ files:
55
55
  - lib/userplex/internal/type/unknown.rb
56
56
  - lib/userplex/internal/util.rb
57
57
  - lib/userplex/models.rb
58
+ - lib/userplex/models/log_batch_params.rb
59
+ - lib/userplex/models/log_batch_response.rb
60
+ - lib/userplex/models/log_new_params.rb
61
+ - lib/userplex/models/log_new_response.rb
58
62
  - lib/userplex/models/user_identify_params.rb
59
63
  - lib/userplex/models/user_identify_response.rb
60
64
  - lib/userplex/request_options.rb
61
- - lib/userplex/resources/events.rb
65
+ - lib/userplex/resources/logs.rb
62
66
  - lib/userplex/resources/users.rb
63
67
  - lib/userplex/version.rb
64
68
  - manifest.yaml
@@ -81,10 +85,14 @@ files:
81
85
  - rbi/userplex/internal/type/unknown.rbi
82
86
  - rbi/userplex/internal/util.rbi
83
87
  - rbi/userplex/models.rbi
88
+ - rbi/userplex/models/log_batch_params.rbi
89
+ - rbi/userplex/models/log_batch_response.rbi
90
+ - rbi/userplex/models/log_new_params.rbi
91
+ - rbi/userplex/models/log_new_response.rbi
84
92
  - rbi/userplex/models/user_identify_params.rbi
85
93
  - rbi/userplex/models/user_identify_response.rbi
86
94
  - rbi/userplex/request_options.rbi
87
- - rbi/userplex/resources/events.rbi
95
+ - rbi/userplex/resources/logs.rbi
88
96
  - rbi/userplex/resources/users.rbi
89
97
  - rbi/userplex/version.rbi
90
98
  - sig/userplex/client.rbs
@@ -106,10 +114,14 @@ files:
106
114
  - sig/userplex/internal/type/unknown.rbs
107
115
  - sig/userplex/internal/util.rbs
108
116
  - sig/userplex/models.rbs
117
+ - sig/userplex/models/log_batch_params.rbs
118
+ - sig/userplex/models/log_batch_response.rbs
119
+ - sig/userplex/models/log_new_params.rbs
120
+ - sig/userplex/models/log_new_response.rbs
109
121
  - sig/userplex/models/user_identify_params.rbs
110
122
  - sig/userplex/models/user_identify_response.rbs
111
123
  - sig/userplex/request_options.rbs
112
- - sig/userplex/resources/events.rbs
124
+ - sig/userplex/resources/logs.rbs
113
125
  - sig/userplex/resources/users.rbs
114
126
  - sig/userplex/version.rbs
115
127
  homepage: https://gemdocs.org/gems/userplex
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Userplex
4
- module Resources
5
- class Events
6
- # @api private
7
- #
8
- # @param client [Userplex::Client]
9
- def initialize(client:)
10
- @client = client
11
- end
12
- end
13
- end
14
- end
@@ -1,12 +0,0 @@
1
- # typed: strong
2
-
3
- module Userplex
4
- module Resources
5
- class Events
6
- # @api private
7
- sig { params(client: Userplex::Client).returns(T.attached_class) }
8
- def self.new(client:)
9
- end
10
- end
11
- end
12
- end
@@ -1,7 +0,0 @@
1
- module Userplex
2
- module Resources
3
- class Events
4
- def initialize: (client: Userplex::Client) -> void
5
- end
6
- end
7
- end