upwork-api 1.0.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.
- data/.docgen +1 -0
- data/.gitignore +22 -0
- data/.travis.yml +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +176 -0
- data/README.md +79 -0
- data/Rakefile +12 -0
- data/example/myapp.rb +59 -0
- data/lib/upwork/api.rb +29 -0
- data/lib/upwork/api/client.rb +163 -0
- data/lib/upwork/api/config.rb +42 -0
- data/lib/upwork/api/logger.rb +35 -0
- data/lib/upwork/api/routers/activities/engagement.rb +54 -0
- data/lib/upwork/api/routers/activities/team.rb +117 -0
- data/lib/upwork/api/routers/auth.rb +38 -0
- data/lib/upwork/api/routers/freelancers/profile.rb +52 -0
- data/lib/upwork/api/routers/freelancers/search.rb +43 -0
- data/lib/upwork/api/routers/hr/clients/applications.rb +55 -0
- data/lib/upwork/api/routers/hr/clients/offers.rb +64 -0
- data/lib/upwork/api/routers/hr/contracts.rb +64 -0
- data/lib/upwork/api/routers/hr/engagements.rb +52 -0
- data/lib/upwork/api/routers/hr/freelancers/applications.rb +54 -0
- data/lib/upwork/api/routers/hr/freelancers/offers.rb +64 -0
- data/lib/upwork/api/routers/hr/interviews.rb +44 -0
- data/lib/upwork/api/routers/hr/jobs.rb +79 -0
- data/lib/upwork/api/routers/hr/milestones.rb +100 -0
- data/lib/upwork/api/routers/hr/roles.rb +49 -0
- data/lib/upwork/api/routers/hr/submissions.rb +63 -0
- data/lib/upwork/api/routers/jobs/profile.rb +43 -0
- data/lib/upwork/api/routers/jobs/search.rb +43 -0
- data/lib/upwork/api/routers/mc.rb +113 -0
- data/lib/upwork/api/routers/metadata.rb +71 -0
- data/lib/upwork/api/routers/organization/companies.rb +67 -0
- data/lib/upwork/api/routers/organization/teams.rb +49 -0
- data/lib/upwork/api/routers/organization/users.rb +49 -0
- data/lib/upwork/api/routers/payments.rb +42 -0
- data/lib/upwork/api/routers/reports/finance/accounts.rb +56 -0
- data/lib/upwork/api/routers/reports/finance/billings.rb +86 -0
- data/lib/upwork/api/routers/reports/finance/earnings.rb +86 -0
- data/lib/upwork/api/routers/reports/time.rb +114 -0
- data/lib/upwork/api/routers/snapshot.rb +95 -0
- data/lib/upwork/api/routers/teams.rb +47 -0
- data/lib/upwork/api/routers/workdiary.rb +53 -0
- data/lib/upwork/api/version.rb +18 -0
- data/test/helper.rb +21 -0
- data/test/test_activities_engagement.rb +21 -0
- data/test/test_activities_team.rb +46 -0
- data/test/test_auth.rb +16 -0
- data/test/test_client.rb +47 -0
- data/test/test_config.rb +25 -0
- data/test/test_freelancers_profile.rb +22 -0
- data/test/test_freelancers_search.rb +16 -0
- data/test/test_hr_clients_applications.rb +21 -0
- data/test/test_hr_clients_offers.rb +26 -0
- data/test/test_hr_contracts.rb +26 -0
- data/test/test_hr_engagements.rb +21 -0
- data/test/test_hr_freelancers_applications.rb +21 -0
- data/test/test_hr_freelancers_offers.rb +26 -0
- data/test/test_hr_interviews.rb +16 -0
- data/test/test_hr_jobs.rb +36 -0
- data/test/test_hr_milestones.rb +46 -0
- data/test/test_hr_roles.rb +21 -0
- data/test/test_hr_submissions.rb +26 -0
- data/test/test_jobs_profile.rb +16 -0
- data/test/test_jobs_search.rb +16 -0
- data/test/test_logger.rb +15 -0
- data/test/test_mc.rb +51 -0
- data/test/test_metadata.rb +41 -0
- data/test/test_organization_companies.rb +31 -0
- data/test/test_organization_teams.rb +21 -0
- data/test/test_organization_users.rb +21 -0
- data/test/test_payments.rb +16 -0
- data/test/test_reports_finance_accounts.rb +21 -0
- data/test/test_reports_finance_billings.rb +36 -0
- data/test/test_reports_finance_earnings.rb +36 -0
- data/test/test_reports_time.rb +41 -0
- data/test/test_snapshot.rb +41 -0
- data/test/test_teams.rb +21 -0
- data/test/test_workdiary.rb +21 -0
- data/upwork-api.gemspec +27 -0
- metadata +242 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
module Hr
|
18
|
+
# Roles
|
19
|
+
class Roles
|
20
|
+
ENTRY_POINT = 'api'
|
21
|
+
|
22
|
+
# Init
|
23
|
+
#
|
24
|
+
# Arguments:
|
25
|
+
# client: (Client)
|
26
|
+
def initialize(client)
|
27
|
+
@client = client
|
28
|
+
@client.epoint = ENTRY_POINT
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get user roles
|
32
|
+
def get_all
|
33
|
+
$LOG.i "running " + __method__.to_s
|
34
|
+
@client.get '/hr/v2/userroles'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Get by specific user
|
38
|
+
#
|
39
|
+
# Arguments:
|
40
|
+
# reference: (String)
|
41
|
+
def get_by_specific_user(user_reference)
|
42
|
+
$LOG.i "running " + __method__.to_s
|
43
|
+
@client.get '/hr/v2/userroles/' + user_reference
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
module Hr
|
18
|
+
# Submissions workflow
|
19
|
+
class Submissions
|
20
|
+
ENTRY_POINT = 'api'
|
21
|
+
|
22
|
+
# Init
|
23
|
+
#
|
24
|
+
# Arguments:
|
25
|
+
# client: (Client)
|
26
|
+
def initialize(client)
|
27
|
+
@client = client
|
28
|
+
@client.epoint = ENTRY_POINT
|
29
|
+
end
|
30
|
+
|
31
|
+
# Freelancer submits work for the client to approve
|
32
|
+
#
|
33
|
+
# Arguments:
|
34
|
+
# params: (Hash)
|
35
|
+
def request_approval(params)
|
36
|
+
$LOG.i "running " + __method__.to_s
|
37
|
+
@client.post '/hr/v3/fp/submissions', params
|
38
|
+
end
|
39
|
+
|
40
|
+
# Approve an existing Submission
|
41
|
+
#
|
42
|
+
# Arguments:
|
43
|
+
# submission_id: (String)
|
44
|
+
# params: (Hash)
|
45
|
+
def approve(submission_id, params)
|
46
|
+
$LOG.i "running " + __method__.to_s
|
47
|
+
@client.put '/hr/v3/fp/submissions/' + submission_id + '/approve', params
|
48
|
+
end
|
49
|
+
|
50
|
+
# Reject an existing Submission
|
51
|
+
#
|
52
|
+
# Arguments:
|
53
|
+
# submission_id: (String)
|
54
|
+
# params: (Hash)
|
55
|
+
def reject(submission_id, params)
|
56
|
+
$LOG.i "running " + __method__.to_s
|
57
|
+
@client.put '/hr/v3/fp/submissions/' + submission_id + '/reject', params
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
module Jobs
|
18
|
+
# Freelancer's profile info
|
19
|
+
class Profile
|
20
|
+
ENTRY_POINT = 'api'
|
21
|
+
|
22
|
+
# Init
|
23
|
+
#
|
24
|
+
# Arguments:
|
25
|
+
# client: (Client)
|
26
|
+
def initialize(client)
|
27
|
+
@client = client
|
28
|
+
@client.epoint = ENTRY_POINT
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get specific profile
|
32
|
+
#
|
33
|
+
# Arguments:
|
34
|
+
# key: (String)
|
35
|
+
def get_specific(key)
|
36
|
+
$LOG.i "running " + __method__.to_s
|
37
|
+
@client.get '/profiles/v1/jobs/' + key
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
module Jobs
|
18
|
+
# Search Job profiles
|
19
|
+
class Search
|
20
|
+
ENTRY_POINT = 'api'
|
21
|
+
|
22
|
+
# Init
|
23
|
+
#
|
24
|
+
# Arguments:
|
25
|
+
# client: (Client)
|
26
|
+
def initialize(client)
|
27
|
+
@client = client
|
28
|
+
@client.epoint = ENTRY_POINT
|
29
|
+
end
|
30
|
+
|
31
|
+
# Search profiles
|
32
|
+
#
|
33
|
+
# Arguments:
|
34
|
+
# params: (Hash)
|
35
|
+
def find(params)
|
36
|
+
$LOG.i "running " + __method__.to_s
|
37
|
+
@client.get '/profiles/v2/search/jobs', params
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
class Mc
|
18
|
+
ENTRY_POINT = 'api'
|
19
|
+
|
20
|
+
# Init
|
21
|
+
#
|
22
|
+
# Arguments:
|
23
|
+
# client: (Client)
|
24
|
+
def initialize(client)
|
25
|
+
@client = client
|
26
|
+
@client.epoint = ENTRY_POINT
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get trays
|
30
|
+
def get_trays
|
31
|
+
$LOG.i "running " + __method__.to_s
|
32
|
+
@client.get '/mc/v1/trays'
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get tray by type
|
36
|
+
#
|
37
|
+
# Arguments:
|
38
|
+
# username: (String)
|
39
|
+
# type: (String)
|
40
|
+
def get_tray_by_type(username, type)
|
41
|
+
$LOG.i "running " + __method__.to_s
|
42
|
+
@client.get '/mc/v1/trays/' + username + '/' + type
|
43
|
+
end
|
44
|
+
|
45
|
+
# List thread details based on thread id
|
46
|
+
#
|
47
|
+
# Arguments:
|
48
|
+
# username: (String)
|
49
|
+
# thread_id: (String)
|
50
|
+
def get_thread_details(username, thread_id)
|
51
|
+
$LOG.i "running " + __method__.to_s
|
52
|
+
@client.get '/mc/v1/threads/' + username + '/' + thread_id
|
53
|
+
end
|
54
|
+
|
55
|
+
# Get a specific thread by context
|
56
|
+
#
|
57
|
+
# Arguments:
|
58
|
+
# username: (String)
|
59
|
+
# job_key: (String)
|
60
|
+
# application_id: (String)
|
61
|
+
# context: (String)
|
62
|
+
def get_thread_by_context(username, job_key, application_id, context = 'Interviews')
|
63
|
+
$LOG.i "running " + __method__.to_s
|
64
|
+
@client.get '/mc/v1/contexts/' + username + '/' + context + ':' + job_key + ':' + application_id
|
65
|
+
end
|
66
|
+
|
67
|
+
# Get a specific thread by context (last message content)
|
68
|
+
#
|
69
|
+
# Arguments:
|
70
|
+
# username: (String)
|
71
|
+
# job_key: (String)
|
72
|
+
# application_id: (String)
|
73
|
+
# context: (String)
|
74
|
+
def get_thread_by_context_last_posts(username, job_key, application_id, context = 'Interviews')
|
75
|
+
$LOG.i "running " + __method__.to_s
|
76
|
+
@client.get '/mc/v1/contexts/' + username + '/' + context + ':' + job_key + ':' + application_id + '/last_posts'
|
77
|
+
end
|
78
|
+
|
79
|
+
# Send new message
|
80
|
+
#
|
81
|
+
# Arguments:
|
82
|
+
# username: (String)
|
83
|
+
# params: (Hash)
|
84
|
+
def start_new_thread(username, params = {})
|
85
|
+
$LOG.i "running " + __method__.to_s
|
86
|
+
@client.post '/mc/v1/threads/' + username, params
|
87
|
+
end
|
88
|
+
|
89
|
+
# Reply to existent thread
|
90
|
+
#
|
91
|
+
# Arguments:
|
92
|
+
# username: (String)
|
93
|
+
# thread_id: (String)
|
94
|
+
# params: (Hash)
|
95
|
+
def reply_to_thread(username, thread_id, params = {})
|
96
|
+
$LOG.i "running " + __method__.to_s
|
97
|
+
@client.post '/mc/v1/threads/' + username + '/' + thread_id, params
|
98
|
+
end
|
99
|
+
|
100
|
+
# Update threads based on user actions
|
101
|
+
#
|
102
|
+
# Arguments:
|
103
|
+
# username: (String)
|
104
|
+
# thread_id: (String)
|
105
|
+
# params: (Hash)
|
106
|
+
def mark_thread(username, thread_id, params = {})
|
107
|
+
$LOG.i "running " + __method__.to_s
|
108
|
+
@client.put '/mc/v1/threads/' + username + '/' + thread_id, params
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
# Get Metadata
|
18
|
+
class Metadata
|
19
|
+
ENTRY_POINT = 'api'
|
20
|
+
|
21
|
+
# Init
|
22
|
+
#
|
23
|
+
# Arguments:
|
24
|
+
# client: (Client)
|
25
|
+
def initialize(client)
|
26
|
+
@client = client
|
27
|
+
@client.epoint = ENTRY_POINT
|
28
|
+
end
|
29
|
+
|
30
|
+
# Get categories
|
31
|
+
def get_categories
|
32
|
+
$LOG.i "running " + __method__.to_s
|
33
|
+
@client.get '/profiles/v1/metadata/categories'
|
34
|
+
end
|
35
|
+
|
36
|
+
# Get categories (v2)
|
37
|
+
def get_categories_v2
|
38
|
+
$LOG.i "running " + __method__.to_s
|
39
|
+
@client.get '/profiles/v2/metadata/categories'
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get skills
|
43
|
+
def get_skills
|
44
|
+
$LOG.i "running " + __method__.to_s
|
45
|
+
@client.get '/profiles/v1/metadata/skills'
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get regions
|
49
|
+
def get_regions
|
50
|
+
$LOG.i "running " + __method__.to_s
|
51
|
+
@client.get '/profiles/v1/metadata/regions'
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get tests
|
55
|
+
def get_tests
|
56
|
+
$LOG.i "running " + __method__.to_s
|
57
|
+
@client.get '/profiles/v1/metadata/tests'
|
58
|
+
end
|
59
|
+
|
60
|
+
# Get reasons
|
61
|
+
#
|
62
|
+
# Arguments:
|
63
|
+
# params: (Hash)
|
64
|
+
def get_reasons(params)
|
65
|
+
$LOG.i "running " + __method__.to_s
|
66
|
+
@client.get '/profiles/v1/metadata/reasons', params;
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# Licensed under the Upwork's API Terms of Use;
|
2
|
+
# you may not use this file except in compliance with the Terms.
|
3
|
+
#
|
4
|
+
# Unless required by applicable law or agreed to in writing, software
|
5
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
6
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7
|
+
# See the License for the specific language governing permissions and
|
8
|
+
# limitations under the License.
|
9
|
+
#
|
10
|
+
# Author:: Maksym Novozhylov (mnovozhilov@upwork.com)
|
11
|
+
# Copyright:: Copyright 2014(c) Upwork.com
|
12
|
+
# License:: See LICENSE.txt and TOS - https://developers.upwork.com/api-tos.html
|
13
|
+
|
14
|
+
module Upwork
|
15
|
+
module Api
|
16
|
+
module Routers
|
17
|
+
module Organization
|
18
|
+
# Companies inside Organization
|
19
|
+
class Companies
|
20
|
+
ENTRY_POINT = 'api'
|
21
|
+
|
22
|
+
# Init
|
23
|
+
#
|
24
|
+
# Arguments:
|
25
|
+
# client: (Client)
|
26
|
+
def initialize(client)
|
27
|
+
@client = client
|
28
|
+
@client.epoint = ENTRY_POINT
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get Companies Info
|
32
|
+
def get_list
|
33
|
+
$LOG.i "running " + __method__.to_s
|
34
|
+
@client.get '/hr/v2/companies'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Get Specific Company
|
38
|
+
#
|
39
|
+
# Arguments:
|
40
|
+
# company_reference: (String)
|
41
|
+
def get_specific(company_reference)
|
42
|
+
$LOG.i "running " + __method__.to_s
|
43
|
+
@client.get '/hr/v2/companies/' + company_reference
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get Teams in Company
|
47
|
+
#
|
48
|
+
# Arguments:
|
49
|
+
# company_reference: (String)
|
50
|
+
def get_teams(company_reference)
|
51
|
+
$LOG.i "running " + __method__.to_s
|
52
|
+
@client.get '/hr/v2/companies/' + company_reference + '/teams'
|
53
|
+
end
|
54
|
+
|
55
|
+
# Get Users in Company
|
56
|
+
#
|
57
|
+
# Arguments:
|
58
|
+
# company_reference: (String)
|
59
|
+
def get_users(company_reference)
|
60
|
+
$LOG.i "running " + __method__.to_s
|
61
|
+
@client.get '/hr/v2/companies/' + company_reference + '/users'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|