cookbook-omnifetch 0.8.0 → 0.10.1
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.
- checksums.yaml +5 -5
- data/lib/cookbook-omnifetch.rb +13 -13
- data/lib/cookbook-omnifetch/artifactory.rb +12 -7
- data/lib/cookbook-omnifetch/artifactserver.rb +3 -3
- data/lib/cookbook-omnifetch/base.rb +1 -1
- data/lib/cookbook-omnifetch/chef_server.rb +2 -2
- data/lib/cookbook-omnifetch/chef_server_artifact.rb +2 -2
- data/lib/cookbook-omnifetch/git.rb +4 -4
- data/lib/cookbook-omnifetch/integration.rb +1 -1
- data/lib/cookbook-omnifetch/metadata_based_installer.rb +14 -13
- data/lib/cookbook-omnifetch/path.rb +1 -1
- data/lib/cookbook-omnifetch/threaded_job_queue.rb +1 -1
- data/lib/cookbook-omnifetch/version.rb +1 -1
- metadata +15 -85
- data/.gitignore +0 -23
- data/.rspec +0 -1
- data/.travis.yml +0 -11
- data/Gemfile +0 -8
- data/README.md +0 -90
- data/Rakefile +0 -19
- data/cookbook-omnifetch.gemspec +0 -39
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/README.md +0 -12
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb +0 -3
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/recipes/default.rb +0 -8
- data/spec/fixtures/cookbooks/example_cookbook/.gitignore +0 -2
- data/spec/fixtures/cookbooks/example_cookbook/.kitchen.yml +0 -26
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile +0 -1
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile.lock +0 -3
- data/spec/fixtures/cookbooks/example_cookbook/README.md +0 -12
- data/spec/fixtures/cookbooks/example_cookbook/metadata.rb +0 -3
- data/spec/fixtures/cookbooks/example_cookbook/recipes/default.rb +0 -8
- data/spec/spec_helper.rb +0 -43
- data/spec/unit/artifactory_spec.rb +0 -64
- data/spec/unit/artifactserver_spec.rb +0 -116
- data/spec/unit/base_spec.rb +0 -87
- data/spec/unit/chef_server_artifact_spec.rb +0 -110
- data/spec/unit/chef_server_spec.rb +0 -108
- data/spec/unit/exceptions_spec.rb +0 -87
- data/spec/unit/git_spec.rb +0 -290
- data/spec/unit/metadata_based_installer_spec.rb +0 -137
- data/spec/unit/path_spec.rb +0 -119
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4df0a66a67a46dc690434e1bc71a7cf0020496214b51b6639236fa3a9843873a
|
4
|
+
data.tar.gz: 3c1d54feae73211f2977a1c4b04fa5c294bd62aa0ace636e9b447175380b7b7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6dcfe66630ecb1af6dabce0f37b5d92454afe523ff22755ec4ebacdb047d6dbfc3fb17ad9cff5d1440d9ebca9d4811663054f344e65e45f81339e530a48250a6
|
7
|
+
data.tar.gz: 94edbbeba3fc3d31a9789a1461cdf878073ed2bfb8d632a52e6ba1b16092331e680d7d720ea01ab2b0d069a70678c3ed20d849453fd1da42f80873535b822f88
|
data/lib/cookbook-omnifetch.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
require_relative "cookbook-omnifetch/version"
|
2
|
+
require_relative "cookbook-omnifetch/integration"
|
3
|
+
|
4
|
+
require_relative "cookbook-omnifetch/base"
|
5
|
+
require_relative "cookbook-omnifetch/git"
|
6
|
+
require_relative "cookbook-omnifetch/github"
|
7
|
+
require_relative "cookbook-omnifetch/path"
|
8
|
+
require_relative "cookbook-omnifetch/artifactserver"
|
9
|
+
require_relative "cookbook-omnifetch/artifactory"
|
10
|
+
require_relative "cookbook-omnifetch/chef_server"
|
11
|
+
require_relative "cookbook-omnifetch/chef_server_artifact"
|
12
12
|
|
13
13
|
module CookbookOmnifetch
|
14
14
|
|
@@ -30,7 +30,7 @@ module CookbookOmnifetch
|
|
30
30
|
#
|
31
31
|
# @return [~BaseLocation, nil]
|
32
32
|
def self.init(dependency, options = {})
|
33
|
-
if klass = klass_from_options(options)
|
33
|
+
if klass = klass_from_options(options) # rubocop: disable Lint/AssignmentInCondition
|
34
34
|
klass.new(dependency, options)
|
35
35
|
else
|
36
36
|
nil
|
@@ -135,7 +135,7 @@ module CookbookOmnifetch
|
|
135
135
|
#
|
136
136
|
# @return [Boolean]
|
137
137
|
def self.cookbook?(path)
|
138
|
-
File.
|
138
|
+
File.exist?(File.join(path, "metadata.json")) || File.exist?(File.join(path, "metadata.rb"))
|
139
139
|
end
|
140
140
|
|
141
141
|
class << self
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
1
|
+
require_relative "base"
|
2
2
|
|
3
|
-
require "mixlib/archive"
|
4
|
-
require "tmpdir"
|
3
|
+
require "mixlib/archive" unless defined?(Mixlib::Archive)
|
4
|
+
require "tmpdir" unless defined?(Dir.mktmpdir)
|
5
5
|
|
6
6
|
module CookbookOmnifetch
|
7
7
|
|
@@ -15,7 +15,12 @@ module CookbookOmnifetch
|
|
15
15
|
super
|
16
16
|
@uri ||= options[:artifactory]
|
17
17
|
@cookbook_version = options[:version]
|
18
|
-
|
18
|
+
if options[:http_client]
|
19
|
+
@http_client = options[:http_client]
|
20
|
+
else
|
21
|
+
headers = { "X-Jfrog-Art-API" => Chef::Config.artifactory_api_key || ENV["ARTIFACTORY_API_KEY"] }
|
22
|
+
@http_client = Chef::HTTP::Simple.new(uri, headers: headers)
|
23
|
+
end
|
19
24
|
end
|
20
25
|
|
21
26
|
def repo_host
|
@@ -93,13 +98,13 @@ module CookbookOmnifetch
|
|
93
98
|
"#to_lock must be implemented on #{self.class.name}!"
|
94
99
|
end
|
95
100
|
|
96
|
-
# The path where all pristine tarballs from an
|
101
|
+
# The path where all pristine tarballs from an artifactory are held.
|
97
102
|
# Tarballs are moved/swapped into this location once they have been staged
|
98
103
|
# in a co-located staging directory.
|
99
104
|
#
|
100
105
|
# @return [Pathname]
|
101
106
|
def cache_root
|
102
|
-
Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "
|
107
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactory")
|
103
108
|
end
|
104
109
|
|
105
110
|
# The path where tarballs are downloaded to and unzipped. On certain platforms
|
@@ -113,7 +118,7 @@ module CookbookOmnifetch
|
|
113
118
|
#
|
114
119
|
# @return [Pathname]
|
115
120
|
def staging_root
|
116
|
-
Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "
|
121
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactory")
|
117
122
|
end
|
118
123
|
|
119
124
|
# The path where the pristine tarball is cached
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative "base"
|
2
|
+
require_relative "metadata_based_installer"
|
3
3
|
|
4
4
|
module CookbookOmnifetch
|
5
5
|
# This location allows fetching from the `cookbook_artifacts/` API where Chef
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require "tmpdir"
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
require "tmpdir" unless defined?(Dir.mktmpdir)
|
2
|
+
require_relative "../cookbook-omnifetch"
|
3
|
+
require_relative "base"
|
4
|
+
require_relative "exceptions"
|
5
5
|
|
6
6
|
module CookbookOmnifetch
|
7
7
|
class GitLocation < BaseLocation
|
@@ -1,21 +1,22 @@
|
|
1
|
-
|
1
|
+
require_relative "threaded_job_queue"
|
2
2
|
|
3
3
|
module CookbookOmnifetch
|
4
4
|
|
5
5
|
class MetadataBasedInstaller
|
6
6
|
class CookbookMetadata
|
7
7
|
|
8
|
-
FILE_TYPES =
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
FILE_TYPES = %i{
|
9
|
+
resources
|
10
|
+
providers
|
11
|
+
recipes
|
12
|
+
definitions
|
13
|
+
libraries
|
14
|
+
attributes
|
15
|
+
files
|
16
|
+
templates
|
17
|
+
root_files
|
18
|
+
all_files
|
19
|
+
}.freeze
|
19
20
|
|
20
21
|
def initialize(metadata)
|
21
22
|
@metadata = metadata
|
@@ -23,7 +24,7 @@ module CookbookOmnifetch
|
|
23
24
|
|
24
25
|
def files(&block)
|
25
26
|
FILE_TYPES.each do |type|
|
26
|
-
next unless @metadata.
|
27
|
+
next unless @metadata.key?(type.to_s)
|
27
28
|
|
28
29
|
@metadata[type.to_s].each do |file|
|
29
30
|
yield file["url"], file["path"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cookbook-omnifetch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
@@ -13,50 +13,28 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2020-08-21 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: mixlib-archive
|
20
20
|
requirement: !ruby/object:Gem::Requirement
|
21
21
|
requirements:
|
22
|
-
- - "
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: '0.4'
|
25
|
-
type: :runtime
|
26
|
-
prerelease: false
|
27
|
-
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
requirements:
|
29
|
-
- - "~>"
|
22
|
+
- - ">="
|
30
23
|
- !ruby/object:Gem::Version
|
31
24
|
version: '0.4'
|
32
|
-
-
|
33
|
-
name: rake
|
34
|
-
requirement: !ruby/object:Gem::Requirement
|
35
|
-
requirements:
|
36
|
-
- - ">="
|
25
|
+
- - "<"
|
37
26
|
- !ruby/object:Gem::Version
|
38
|
-
version: '0'
|
39
|
-
type: :
|
27
|
+
version: '2.0'
|
28
|
+
type: :runtime
|
40
29
|
prerelease: false
|
41
30
|
version_requirements: !ruby/object:Gem::Requirement
|
42
31
|
requirements:
|
43
32
|
- - ">="
|
44
33
|
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
46
|
-
-
|
47
|
-
name: rspec
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
requirements:
|
50
|
-
- - "~>"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '3.0'
|
53
|
-
type: :development
|
54
|
-
prerelease: false
|
55
|
-
version_requirements: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
34
|
+
version: '0.4'
|
35
|
+
- - "<"
|
58
36
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
37
|
+
version: '2.0'
|
60
38
|
description:
|
61
39
|
email:
|
62
40
|
- jamie@vialstudios.com
|
@@ -64,19 +42,12 @@ email:
|
|
64
42
|
- michael.ivey@riotgames.com
|
65
43
|
- justin@justincampbell.me
|
66
44
|
- sethvargo@gmail.com
|
67
|
-
- dan@
|
45
|
+
- dan@chef.io
|
68
46
|
executables: []
|
69
47
|
extensions: []
|
70
48
|
extra_rdoc_files: []
|
71
49
|
files:
|
72
|
-
- ".gitignore"
|
73
|
-
- ".rspec"
|
74
|
-
- ".travis.yml"
|
75
|
-
- Gemfile
|
76
50
|
- LICENSE
|
77
|
-
- README.md
|
78
|
-
- Rakefile
|
79
|
-
- cookbook-omnifetch.gemspec
|
80
51
|
- lib/cookbook-omnifetch.rb
|
81
52
|
- lib/cookbook-omnifetch/artifactory.rb
|
82
53
|
- lib/cookbook-omnifetch/artifactserver.rb
|
@@ -91,29 +62,9 @@ files:
|
|
91
62
|
- lib/cookbook-omnifetch/path.rb
|
92
63
|
- lib/cookbook-omnifetch/threaded_job_queue.rb
|
93
64
|
- lib/cookbook-omnifetch/version.rb
|
94
|
-
|
95
|
-
- spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb
|
96
|
-
- spec/fixtures/cookbooks/example_cookbook-0.5.0/recipes/default.rb
|
97
|
-
- spec/fixtures/cookbooks/example_cookbook/.gitignore
|
98
|
-
- spec/fixtures/cookbooks/example_cookbook/.kitchen.yml
|
99
|
-
- spec/fixtures/cookbooks/example_cookbook/Berksfile
|
100
|
-
- spec/fixtures/cookbooks/example_cookbook/Berksfile.lock
|
101
|
-
- spec/fixtures/cookbooks/example_cookbook/README.md
|
102
|
-
- spec/fixtures/cookbooks/example_cookbook/metadata.rb
|
103
|
-
- spec/fixtures/cookbooks/example_cookbook/recipes/default.rb
|
104
|
-
- spec/spec_helper.rb
|
105
|
-
- spec/unit/artifactory_spec.rb
|
106
|
-
- spec/unit/artifactserver_spec.rb
|
107
|
-
- spec/unit/base_spec.rb
|
108
|
-
- spec/unit/chef_server_artifact_spec.rb
|
109
|
-
- spec/unit/chef_server_spec.rb
|
110
|
-
- spec/unit/exceptions_spec.rb
|
111
|
-
- spec/unit/git_spec.rb
|
112
|
-
- spec/unit/metadata_based_installer_spec.rb
|
113
|
-
- spec/unit/path_spec.rb
|
114
|
-
homepage: http://www.getchef.com/
|
65
|
+
homepage: https://github.com/chef/cookbook-omnifetch
|
115
66
|
licenses:
|
116
|
-
- Apache
|
67
|
+
- Apache-2.0
|
117
68
|
metadata: {}
|
118
69
|
post_install_message:
|
119
70
|
rdoc_options: []
|
@@ -123,37 +74,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
74
|
requirements:
|
124
75
|
- - ">="
|
125
76
|
- !ruby/object:Gem::Version
|
126
|
-
version: '
|
77
|
+
version: '2.4'
|
127
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
79
|
requirements:
|
129
80
|
- - ">="
|
130
81
|
- !ruby/object:Gem::Version
|
131
82
|
version: '0'
|
132
83
|
requirements: []
|
133
|
-
|
134
|
-
rubygems_version: 2.6.13
|
84
|
+
rubygems_version: 3.0.3
|
135
85
|
signing_key:
|
136
86
|
specification_version: 4
|
137
87
|
summary: Library code to fetch Chef cookbooks from a variety of sources to a local
|
138
88
|
cache
|
139
|
-
test_files:
|
140
|
-
- spec/fixtures/cookbooks/example_cookbook-0.5.0/README.md
|
141
|
-
- spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb
|
142
|
-
- spec/fixtures/cookbooks/example_cookbook-0.5.0/recipes/default.rb
|
143
|
-
- spec/fixtures/cookbooks/example_cookbook/.gitignore
|
144
|
-
- spec/fixtures/cookbooks/example_cookbook/.kitchen.yml
|
145
|
-
- spec/fixtures/cookbooks/example_cookbook/Berksfile
|
146
|
-
- spec/fixtures/cookbooks/example_cookbook/Berksfile.lock
|
147
|
-
- spec/fixtures/cookbooks/example_cookbook/README.md
|
148
|
-
- spec/fixtures/cookbooks/example_cookbook/metadata.rb
|
149
|
-
- spec/fixtures/cookbooks/example_cookbook/recipes/default.rb
|
150
|
-
- spec/spec_helper.rb
|
151
|
-
- spec/unit/artifactory_spec.rb
|
152
|
-
- spec/unit/artifactserver_spec.rb
|
153
|
-
- spec/unit/base_spec.rb
|
154
|
-
- spec/unit/chef_server_artifact_spec.rb
|
155
|
-
- spec/unit/chef_server_spec.rb
|
156
|
-
- spec/unit/exceptions_spec.rb
|
157
|
-
- spec/unit/git_spec.rb
|
158
|
-
- spec/unit/metadata_based_installer_spec.rb
|
159
|
-
- spec/unit/path_spec.rb
|
89
|
+
test_files: []
|
data/.gitignore
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
*.gem
|
2
|
-
*.rbc
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
.yardoc
|
6
|
-
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
*.bundle
|
19
|
-
*.so
|
20
|
-
*.o
|
21
|
-
*.a
|
22
|
-
mkmf.log
|
23
|
-
.idea/*
|
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
-c -f documentation
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/README.md
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
# CookbookOmnifetch
|
2
|
-
|
3
|
-
`CookbookOmnifetch` provides library code for fetching Chef cookbooks
|
4
|
-
from an artifact server (usually https://supermarket.chef.io),
|
5
|
-
git/github, a local path, or a chef-server to a local cache for
|
6
|
-
developement.
|
7
|
-
|
8
|
-
## Installation
|
9
|
-
|
10
|
-
Add this line to your application's Gemfile:
|
11
|
-
|
12
|
-
gem 'cookbook-omnifetch'
|
13
|
-
|
14
|
-
And then execute:
|
15
|
-
|
16
|
-
$ bundle
|
17
|
-
|
18
|
-
Or install it yourself as:
|
19
|
-
|
20
|
-
$ gem install cookbook-omnifetch
|
21
|
-
|
22
|
-
## Usage
|
23
|
-
|
24
|
-
#### Inject Dependencies and Configure
|
25
|
-
|
26
|
-
Cookbook Omnifetch is designed to work with utilities from both the
|
27
|
-
Berkshelf and Chef Software ecosystems, so you have to configure it
|
28
|
-
before you can use it. In ChefDK, we do this:
|
29
|
-
|
30
|
-
```ruby
|
31
|
-
# Configure CookbookOmnifetch's dependency injection settings to use our classes and config.
|
32
|
-
CookbookOmnifetch.configure do |c|
|
33
|
-
c.cache_path = File.expand_path('~/.chefdk/cache')
|
34
|
-
c.storage_path = Pathname.new(File.expand_path('~/.chefdk/cache/cookbooks'))
|
35
|
-
c.shell_out_class = ChefDK::ShellOut
|
36
|
-
c.cached_cookbook_class = ChefDK::CookbookMetadata
|
37
|
-
end
|
38
|
-
```
|
39
|
-
|
40
|
-
#### Fetching Cookbooks
|
41
|
-
|
42
|
-
To download a cookbook:
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
fetcher = CookbookOmnifetch.init(dependency, source_options)
|
46
|
-
fetcher.install
|
47
|
-
```
|
48
|
-
|
49
|
-
To specify the cookbook you want, you give CookbookOmnifetch a
|
50
|
-
dependency object that responds to `#name` and `#version_constraint`,
|
51
|
-
e.g.:
|
52
|
-
|
53
|
-
```ruby
|
54
|
-
require 'semverse'
|
55
|
-
|
56
|
-
Dependency = Struct.new(:name, :version_constraint)
|
57
|
-
|
58
|
-
my_dep = Dependency.new("apache2", Semverse::Constraint.new("~> 1.0"))
|
59
|
-
```
|
60
|
-
|
61
|
-
The source options for the cookbook are given as a Hash; the keys and
|
62
|
-
values vary based on the kind of storage location. As with Bundler's
|
63
|
-
`gem` options, one key specifies the type of upstream service for the
|
64
|
-
cookbook while other keys specify other options specific to that type.
|
65
|
-
For example:
|
66
|
-
|
67
|
-
```ruby
|
68
|
-
CookbookOmnifetch.init(dependency, artifact_server: "https://supermarket.chef.io/api/v1/cookbooks/apache2/versions/3.0.1/download")
|
69
|
-
CookbookOmnifetch.init(dependency, git: "git@github.com:svanzoest/apache2-cookbook.git", tag: "v3.0.1")
|
70
|
-
CookbookOmnifetch.init(dependency, github: "svanzoest/apache2-cookbook", tag: "v3.0.1")
|
71
|
-
CookbookOmnifetch.init(dependency, path: "~/chef-cookbooks/apache2")
|
72
|
-
```
|
73
|
-
|
74
|
-
## Contributing
|
75
|
-
|
76
|
-
For information on contributing to this project, see https://github.com/chef/chef/blob/master/CONTRIBUTING.md
|
77
|
-
|
78
|
-
After that:
|
79
|
-
|
80
|
-
1. Fork it
|
81
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
82
|
-
3. Commit your changes (`git commit -asm 'Add some feature'`)
|
83
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
84
|
-
5. Create a new Pull Request
|
85
|
-
|
86
|
-
## Thanks
|
87
|
-
|
88
|
-
This code was initially extracted from Berkshelf. Thanks to the
|
89
|
-
Berkshelf core teams and contributors.
|
90
|
-
|