KPLL-102 - Kong Developer Portal
THE CLOUD CONNECTIVITY COMPANY1© Kong Inc.THE CLOUDCONNECTIVITY COMPANYKong Academyを日本語でお届け!#4KPLL-102 - Kong Developer Portal施文翰(Wenhan Shi) – Solutions EngineerJuly 28th, 2022
View Slide
THE CLOUD CONNECTIVITY COMPANY2© Kong Inc. 2Who am I施 文翰(シ ブンカン) Wenhan Shi• 日立製作所 - Linux kernel module development/Support• Red Hat K.K. - GlusterFS/OpenShift Support• Canonical Japan K.K. - Ubuntu/OpenStack/Kubernetes Support• Rancher Lab/SUSE - Rancher Support• Kong Inc. - Solutions Engineer@shi_wenhan[email protected]
THE CLOUD CONNECTIVITY COMPANY3© Kong Inc. 3本セッションについてKong Academy KPLL-102 Kong Developer Portal をベースに日本語でお届けします- https://education.konghq.com/- 全てレベル100、無償でオンライン受講可能(自習形式)- レベル200以上は有償で提供(サブスクリプション)- 講師によるトレーニングを実施- Kong認定証を授与
THE CLOUD CONNECTIVITY COMPANY4© Kong Inc.● Deployment Kong for Dev portal● Enable Kong Dev portal● Customization● Publish Specs to Portal● Developer Experience● DevOps Portal ManagementAgenda
THE CLOUD CONNECTIVITY COMPANY5© Kong Inc. 5Kong Developer Portalhttps://docs.konghq.com/gateway/latest/install-and-run/
THE CLOUD CONNECTIVITY COMPANY6© Kong Inc. 6Kong Gateway DeploymentFor Dev portal
THE CLOUD CONNECTIVITY COMPANY7© Kong Inc. 7Install Kong Gatewayhttps://docs.konghq.com/gateway/latest/install-and-run/
THE CLOUD CONNECTIVITY COMPANY8© Kong Inc. 8Need Database for Dev portalDB Less DBConfig store Declarative configuration Databasemode Available for OSS, EnterprisePros Easy and quick Fully customizableComponentsProxy Yes YesAdmin API No YesManager (GUI) No YesDev Portal No YesVitals No Yes
THE CLOUD CONNECTIVITY COMPANY9© Kong Inc. 9Deploying Kong gateway on VMInstall the packageFor RHEL system, import the repo and install the package via yumSetup Database License deployStart Kong Gatewaycurl $(rpm --eval "https://download.konghq.com/gateway-2.x-rhel-%{rhel}/config.repo") | sudo tee /etc/yum.repos.d/kong.reposudo yum install kong-enterprise-edition-2.8.1.2
THE CLOUD CONNECTIVITY COMPANY10© Kong Inc. 10Deploying Kong gateway on VMInstall the packageCreate User and Database for Kong GatewaySetup kong.conf to let Kong Gateway can connect to your database.A example file is at /etc/kong/kong.conf.defaulthttps://docs.konghq.com/gateway/2.8.x/reference/configuration/#datastore-sectionInitialize the database by running the Kong Gateway migrationsSetup Database Start Kong Gateway License deployCREATE USER kong WITH PASSWORD 'super_secret';CREATE DATABASE kong OWNER kong;kong migrations bootstrap -c {PATH_TO_KONG.CONF_FILE}
THE CLOUD CONNECTIVITY COMPANY11© Kong Inc. 11Deploying Kong gateway on VMInstall the packageCreate User and Database for Kong GatewaySetup kong.conf to let Kong Gateway can connect to your database.A example file is at /etc/kong/kong.conf.defaulthttps://docs.konghq.com/gateway/2.8.x/reference/configuration/#datastore-sectionInitialize the database by running the Kong Gateway migrationsSetup Database Start Kong Gateway License deployCREATE USER kong WITH PASSWORD 'super_secret';CREATE DATABASE kong OWNER kong;kong migrations bootstrap -c {PATH_TO_KONG.CONF_FILE}
THE CLOUD CONNECTIVITY COMPANY12© Kong Inc. 12Deploying Kong on VMInstall the packageStart Kong Gateway with the config file.You should have a 200 response from port 8001Setup Database Start Kong Gateway License deploykong start -c {PATH_TO_KONG.CONF_FILE}curl -i http://localhost:8001
THE CLOUD CONNECTIVITY COMPANY13© Kong Inc. 13Deploying Kong on VMInstall the packageApply the license using the Admin API.Setup Database Start Kong Gateway License deploycurl -i -X POST http://localhost:8001/licenses \-d payload='{"license":{"payload":{"admin_seats":"1","customer":"Example Company,Inc","dataplanes":"1","license_creation_date":"2017-07-20","license_expiration_date":"2017-07-20","license_key":"00141000017ODj3AAG_a1V41000004wT0OEAU","product_subscription":"KonnectEnterprise","support_plan":"None"},"signature":"6985968131533a967fcc721244a979948b1066967f1e9cd65dbd8eeabe060fc32d894a2945f5e4a03c1cd2198c74e058ac63d28b045c2f1fcec95877bd790e1b","version":"1"}}'
THE CLOUD CONNECTIVITY COMPANY14© Kong Inc. 14OverviewEC2 nodeKong GatewayAdmin API8001Dev portal8003Kong Proxy8000
THE CLOUD CONNECTIVITY COMPANY15© Kong Inc. 15Enable Kong Dev portal
THE CLOUD CONNECTIVITY COMPANY16© Kong Inc. 16Dev portal is NOT enable by default.
THE CLOUD CONNECTIVITY COMPANY17© Kong Inc.- Set “portal = on” in kong configuration and restart Kong Gateway service.17Step 1. Enable Dev Portal in the Kong Configuration
THE CLOUD CONNECTIVITY COMPANY18© Kong Inc. 18Step 2. Enable Dev Portal in Kong ManagerClick on DeveloperPortals in the KongManagerClick on Set upDev PortalClick on EnableDeveloperPortalDeveloperPortalDashboardLaunchDeveloperPortal
THE CLOUD CONNECTIVITY COMPANY19© Kong Inc. 19Step 2. Enable Dev Portal in Kong ManagerClick on DeveloperPortals in the KongManagerClick on Set upDev PortalClick on EnableDeveloperPortalDeveloperPortalDashboardLaunchDeveloperPortal
THE CLOUD CONNECTIVITY COMPANY20© Kong Inc. 20Step 2. Enable Dev Portal in Kong ManagerClick on DeveloperPortals in the KongManagerClick on Set upDev PortalClick on EnableDeveloperPortalDeveloperPortalDashboardLaunchDeveloperPortal
THE CLOUD CONNECTIVITY COMPANY21© Kong Inc. 21Step 2. Enable Dev Portal in Kong ManagerClick on DeveloperPortals in the KongManagerClick on Set upDev PortalClick on EnableDeveloperPortalDeveloperPortalDashboardLaunchDeveloperPortal
THE CLOUD CONNECTIVITY COMPANY22© Kong Inc. 22Step 2. Enable Dev Portal in Kong ManagerClick on DeveloperPortals in the KongManagerClick on Set upDev PortalClick on EnableDeveloperPortalDeveloperPortalDashboardLaunchDeveloperPortal
THE CLOUD CONNECTIVITY COMPANY23© Kong Inc. 23Step 3. Enable Basic Authentication (Optional)- In Kong Manager > Dev Portal > Settings > Authentication,select Basic Authentication under the Authentication Plugin- This will require users to register and login for using Dev portal
THE CLOUD CONNECTIVITY COMPANY24© Kong Inc. 24Step 4. Enable Auto Approve Access (Optional)- With this setting, a developer will automatically be marked as "approved" after completingregistration.
THE CLOUD CONNECTIVITY COMPANY25© Kong Inc. 25Customization
THE CLOUD CONNECTIVITY COMPANY26© Kong Inc. 26Customize Logo and Styles- Confirm and update theme In Kong Manager > Dev Portal > Appearance
THE CLOUD CONNECTIVITY COMPANY27© Kong Inc. 27Customize Web Content- Click Kong Manager > Dev Portal > Editor to enter editor mode
THE CLOUD CONNECTIVITY COMPANY28© Kong Inc. 28Customize Web Content- Update Title of index page
THE CLOUD CONNECTIVITY COMPANY29© Kong Inc. 29Customize Web Content- Index page get updated.
THE CLOUD CONNECTIVITY COMPANY30© Kong Inc. 30Customize Web Content- Modify footer
THE CLOUD CONNECTIVITY COMPANY31© Kong Inc. 31Customize Web Content- Modify filter
THE CLOUD CONNECTIVITY COMPANY32© Kong Inc. 32Customize Web Content- Modify Client
THE CLOUD CONNECTIVITY COMPANY33© Kong Inc. 33Publish Specs to Portal
THE CLOUD CONNECTIVITY COMPANY34© Kong Inc. 34Publish Open API specification from Kong Manager- 3 specs are already present by default
THE CLOUD CONNECTIVITY COMPANY35© Kong Inc. 35Publish Open API specification from Kong Manager- Create a new file by clicking the New File option, and select spec in the File Type
THE CLOUD CONNECTIVITY COMPANY36© Kong Inc. 36Publish Open API specification from Kong Manager- Copy the API Specification to the stock-0.1.yaml file, and click “Save Changes”
THE CLOUD CONNECTIVITY COMPANY37© Kong Inc. 37Publish Open API specification from Kong Manager- The Stock API is available in the developer portal
THE CLOUD CONNECTIVITY COMPANY38© Kong Inc. 38Add Tags in Open API Spec to Categorize and Filter- Tags and description can be used to filter the specifications.
THE CLOUD CONNECTIVITY COMPANY39© Kong Inc. 39Add Tags in Open API Spec to Categorize and Filter-
THE CLOUD CONNECTIVITY COMPANY40© Kong Inc. 40Using RBAC to control access to API content- Kong's Developer Portal can setup Role Based Access Control (RBAC) to control access topublished content.- In this section, we will setup two roles,- internal developers- external developers- Either Kong Manager or the Admin API can be used to manage Developer and Roles.
THE CLOUD CONNECTIVITY COMPANY41© Kong Inc. 41Using RBAC to control access to API content- Create 2 roles❯ http post :31001/developers/rolesname=Internal-Developers Kong-Admin-Token:kongHTTP/1.1 201 Created…{"comment": null,"created_at": 1658726280,"id": "611498b8-d51f-4234-902a-4c4940e4d113","name": "Internal-Developers","permissions": {}}❯ http post :31001/developers/rolesname=External-Developers Kong-Admin-Token:kongHTTP/1.1 201 Created…{"comment": null,"created_at": 1658726281,"id": "79d23b0c-2573-45f0-a33a-cc3805d36b69","name": "External-Developers","permissions": {}}
THE CLOUD CONNECTIVITY COMPANY42© Kong Inc. 42Using RBAC to control access to API content- Create 2 Developers$ http post :31004/registerContent-Type:'application/json' \[email protected] \password=Kong123 meta="{\"full_name\":\"InternalDeveloper\"}" Kong-Admin-Token:kongHTTP/1.1 200 OK…Vary: Origin{"developer": {"consumer": {"id": "c186489d-94fa-41e7-a65d-514294ba2765"},"created_at": 1590118499,"email": "[email protected]","id": "4fe3ee80-c114-4191-b075-eada26b2d2e4","meta": "{\"full_name\":\"Internal Developer\"}","status": 0,"updated_at": 1590118499}}$ http post :31004/registerContent-Type:'application/json' \[email protected] \password=Kong123 meta="{\"full_name\":\"ExternalDeveloper\"}" Kong-Admin-Token:kongHTTP/1.1 200 OK…Vary: Origin{"developer": {"consumer": {"id": "3e2807c1-1a16-4af6-a69c-a5bee5e34b73"},"created_at": 1590118509,"email": "[email protected]","id": "5052f5b1-fa6d-40ba-a38c-bb621c07f3de","meta": "{\"full_name\":\"External Developer\"}","status": 0,"updated_at": 1590118509}}
THE CLOUD CONNECTIVITY COMPANY43© Kong Inc. 43Using RBAC to control access to API content- Assign Roles to Developer$ http patch:31001/developers/[email protected]roles:='["Internal-Developers"]' Kong-Admin-Token:kongHTTP/1.1 200 OK...{"developer": {"consumer": {"id": "d6b9c444-1398-497a-9068-2bb724177f68"},"created_at": 1587650139,"email": "[email protected]","id": "a6fe186d-bf16-41e8-b431-b53b61a316e3","meta": "{\"full_name\":\"Internal Developer\"}","rbac_user": {"id": "3f83d6cb-c338-4855-be78-364d6906861a"},"roles": ["Internal-Developers"],"status": 0,"updated_at": 1587650696}}$ http patch:31001/developers/[email protected]roles:='["External-Developers"]' Kong-Admin-Token:kongHTTP/1.1 200 OK...{"developer": {"consumer": {"id": "8e064119-538e-4149-85c5-48875b4f6814"},"created_at": 1587650218,"email": "[email protected]","id": "39c6af17-3514-4286-a14f-9a88abfcf5ee","meta": "{\"full_name\":\"External Developer\"}","rbac_user": {"id": "57517f51-2a07-4698-b876-864ab874f143"},"roles": ["External-Developers"],"status": 0,"updated_at": 1587650722}}
THE CLOUD CONNECTIVITY COMPANY44© Kong Inc. 44Using RBAC to control access to API content- Config Developer Permissions, by click Permission under Dev Portal and click Content tab
THE CLOUD CONNECTIVITY COMPANY45© Kong Inc. 45Using RBAC to control access to API content- Under specs, find petstore and select Internal-Developers role then update- This will remove the default permission and only grants the Internal-Developers role.
THE CLOUD CONNECTIVITY COMPANY46© Kong Inc. 46Using RBAC to control access to API content- Now petstore API can only be seen when login as an internal user.
THE CLOUD CONNECTIVITY COMPANY47© Kong Inc. 47Publish Additional content (new header to a new page.)- Create the header- Under theme, create a new file base/layouts/custom_pg_layout.html.And add thefollowing contents to it.{% layout = "layouts/_page.html" %}{-content-}{* page.body *}{-content-}
THE CLOUD CONNECTIVITY COMPANY48© Kong Inc. 48Publish Additional content (new header to a new page.)- Create the new Products page- Under content, create a new file products/index.md. And add the following contents.---layout: custom_pg_layout.html---Our API ProductsHere are some of the API Products we offerFinance PackageeCommerce PackageUtilities PackagePaidPaidFreeMonthly planMonthly planNALearn moreLearn moreLearn more
THE CLOUD CONNECTIVITY COMPANY49© Kong Inc. 49Publish Additional content (new header to a new page.)- Link the Products page and the header menu.- Go to /base/partials/menu.html under themes. And add below item inside - API Products
THE CLOUD CONNECTIVITY COMPANY50© Kong Inc. 50Publish Additional content (new header to a new page.)- Now you should see a public page for API Products added to menu and when you click on it, you shouldsee the products page:
THE CLOUD CONNECTIVITY COMPANY51© Kong Inc. 51Developer Experience
THE CLOUD CONNECTIVITY COMPANY52© Kong Inc. 52Test an API in the dev portal page- Click Petstore API and Select “/pet/findByStatus” GET method
THE CLOUD CONNECTIVITY COMPANY53© Kong Inc. 53Test an API in the dev portal page- Click “Try it out” - Selecting the Available input parameter andclick “execute”
THE CLOUD CONNECTIVITY COMPANY54© Kong Inc. 54Test an API in the dev portal page- The response is on the right side- You can choose the response type
THE CLOUD CONNECTIVITY COMPANY55© Kong Inc. 55Test an API in the dev portal page- The code snippets is on up right, it can be used in applications to access the API.
THE CLOUD CONNECTIVITY COMPANY56© Kong Inc. 56Test an API in the dev portal page- Add a new code snippets Java- Kong can provide code snippetfor over ten languages.- Go tobase/layouts/system/spec-renderer.html under Themes- Replace the theme(Line 64),- This is changing the default onwhich doesn’t specify anylanguages.
THE CLOUD CONNECTIVITY COMPANY57© Kong Inc. 57Test an API in the dev portal page- Refresh the page to check the new Java code snippets
THE CLOUD CONNECTIVITY COMPANY58© Kong Inc. 58Application Registration- In this section we will setup services for registration by Developers through theDeveloper Portal.- This allows Developers to obtain unique credentials to access the registered APIs.- Create a service, route, and an “application-registration” plugin.# Setup Stock API servicehttp :31001/services name=Stock-Service url='http://httpbin.org/anything' Kong-Admin-Token:kong# Setup route and application-registration pluginhttp -f :31001/services/Stock-Service/routes name='getStockQuote' paths="/stock/historical"Kong-Admin-Token:kong# Enable Application Plugin for servicehttp -f :31001/services/Stock-Service/plugins name=application-registration \config.display_name=Stock-API config.auto_approve=true Kong-Admin-Token:kong# Enable Oauth2 for servicehttp -f :31001/services/Stock-Service/plugins name=oauth2 config.enable_client_credentials=trueKong-Admin-Token:kong
THE CLOUD CONNECTIVITY COMPANY59© Kong Inc. 59Application Registration- Verify on the GUI
THE CLOUD CONNECTIVITY COMPANY60© Kong Inc. 60Application Registration- Create an Application as a Developer- Login to Dev Portal as [email protected]/Kong123- Click My Apps and Click + New Application.- Enter the following details for the Application.- Name: Finance Mobile App- Redirect URI: http://test.com/redirect- Description: Finance Mobile App
THE CLOUD CONNECTIVITY COMPANY61© Kong Inc. 61Application Registration- Create an Application as a Developer- Click Create and you should see a confirmation as shown below:
THE CLOUD CONNECTIVITY COMPANY62© Kong Inc. 62Application Registration- Activate the Stock API Service for the Application- Then the stock-API service can be used in this Application.
THE CLOUD CONNECTIVITY COMPANY63© Kong Inc. 63Application Registration- Get the OAuth2 access token by the “client_id” and “client_secret”. We will then use theaccess token to test the Stock API.
THE CLOUD CONNECTIVITY COMPANY64© Kong Inc. 64Application Registration- Post a request to the secured Kong proxy as shown below- Then the stock-API service can be used in this Application.$ export CLIENT_ID='ILljp6dBmo5IBQYEzt2lXG6QnTb9SnRw'$ export CLIENT_SECRET='lTptRAIPp2bwFKorUVSfTRvQFSQ7ILSt'$ http --verify=no POST"https://localhost:31443/stock/historical/oauth2/token?grant_type=client_credentials&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET" content-type:multipart/form-data Kong-Admin-Token:kongHTTP/1.1 200 OKConnection: keep-aliveContent-Length: 91Content-Type: application/json; charset=utf-8Date: Thu, 28 Jul 2022 05:29:14 GMTServer: kong/2.8.1.2-enterprise-editionX-Kong-Response-Latency: 129cache-control: no-storepragma: no-cache{"access_token": "q5K4VKWoNsUj5zekLwgq4SCKPl3psqfl","expires_in": 7200,"token_type": "bearer"}
THE CLOUD CONNECTIVITY COMPANY65© Kong Inc. 65Application Registration- For simplicity we will get another access token, and save it in a variable:❯ ACCESS_TOKEN=`http --verify=no POST"https://localhost:31443/stock/historical/oauth2/token?grant_type=client_credentials&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET" content-type:multipart/form-data Kong-Admin-Token:kong | jq -r.access_token`❯ echo $ACCESS_TOKENbRNFmdH1ldL99IAlPg4Cy2bLTmKWL9iS
THE CLOUD CONNECTIVITY COMPANY66© Kong Inc. 66Application Registration- Call the Stock API with the access token❯ http --verify=no GET https://localhost:31443/stock/historical\?tickers\=AAPL "authorization:Bearer $ACCESS_TOKEN"HTTP/1.1 200 OKAccess-Control-Allow-Credentials: trueAccess-Control-Allow-Origin: *Connection: keep-aliveContent-Length: 911Content-Type: application/jsonDate: Thu, 28 Jul 2022 05:36:23 GMTServer: gunicorn/19.9.0Via: kong/2.8.1.2-enterprise-editionX-Kong-Proxy-Latency: 33X-Kong-Upstream-Latency: 552{"args": {"tickers": "AAPL"},"data": "","files": {},"form": {},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate",…
THE CLOUD CONNECTIVITY COMPANY67© Kong Inc. 67Configure Mocking Plugin- Mocking allows a sample response from a spec to be returned when an API is queried.This is helpful to Developers when interact and confirm responses from APIs before theAPI was built.- Setup Mocking plugin on the route and specify the stock specification(stock-0.1.yaml).http -f :31001/routes/getStockQuote/plugins name=mocking config.api_specification_filename=stock-0.1.yaml
THE CLOUD CONNECTIVITY COMPANY68© Kong Inc. 68Configure Mocking Plugin- Call the Stock API with the access tokenagain and the mocking plug-in returnsthe sample response from the Stock APIspecification.HTTP/1.1 200 OKcontent-length: 282content-type: application/json; charset=utf-8date: Wed, 20 May 2020 04:23:51 GMTserver: kong/1.5.0.2-enterprise-editionx-kong-mocking-plugin: truex-kong-response-latency: 3{"meta_data": {"api_name": "historical_stock_price_v2","credit_cost": 10,"end_date": "yesterday","num_total_data_points": 1,"start_date": "yesterday"},"result_data": {"AAPL": [{"adj_close": 175.03,"close": 150.03,"date": "2000-04-23","high": 200.75,"low": 100.87,"open": 100.87,"volume": 12333}]}}
THE CLOUD CONNECTIVITY COMPANY69© Kong Inc. 69DevOps Portal Management
THE CLOUD CONNECTIVITY COMPANY70© Kong Inc. 70Dev Ops for Portal - Version Control- There is a Kong Portal CLI(https://github.com/Kong/kong-portal-cli) which can help youto integrate Portal configuration/content into source control & DevOps to thenpublish/deploy to Portal runtime.- In this section we will use the portal CLI to view the configuration of the Dev Portal, fetchthe current Dev portal, modify it and deploy it.
THE CLOUD CONNECTIVITY COMPANY71© Kong Inc. 71Dev Ops for Portal - Version Control- Clone the template repo, and then edit the default configuration:- The default config will being printedgit clone https://github.com/Kong/kong-portal-templates.gitcd kong-portal-templates/sed -i "/^kong_admin_token/ckong_admin_token: 'kong'" workspaces/default/cli.conf.yaml❯ portal config defaultCLI Config:kong_admin_url: 'http://localhost:8001'kong_admin_token: kongPortal Config:name: Kong Portalapp_version: 2fc6a56theme:name: baseredirect:unauthenticated: login…
THE CLOUD CONNECTIVITY COMPANY72© Kong Inc. 72Dev Ops for Portal - Version Control- Fetch the current deployed Portal configuration❯ portal fetch defaultAdded: emails/application-service-rejected.txtAdded: specs/stock-0.1.yamlModified: content/index.txtModified: themes/base/partials/menu.htmlAdded: content/products/index.mdAdded: emails/application-service-revoked.txtAdded: emails/application-service-approved.txtModified: portal.conf.yamlModified: themes/base/partials/service-catalog/filter.htmlAdded: emails/application-service-requested.txtModified: themes/base/partials/homepage/clients.htmlAdded: themes/base/assets/js/app-44b7b4e.min.jsAdded: themes/base/layouts/custom_pg_layout.htmlAdded: emails/application-service-pending.txtAdded: themes/base/assets/js/kongponents-44b7b4e.min.jsModified: themes/base/partials/footer.htmlFetched 112 filesNo changes.Done.
THE CLOUD CONNECTIVITY COMPANY73© Kong Inc. 73Dev Ops for Portal - Version Control- Modify contents of the Products page❯ sed -i 's/Utilities/Logistics/g' workspaces/default/content/products/index.md
THE CLOUD CONNECTIVITY COMPANY74© Kong Inc. 74Dev Ops for Portal - Version Control- Deploy the local change to Portal container (server) ...❯ portal deploy default✔ Wiped all Files from defaultDeploying default:Deployed ✔ configsDeployed ✔ contentDeployed ✔ specsDeployed ✔ emailsDeployed ✔ themes✔ Deployed all files to default
THE CLOUD CONNECTIVITY COMPANY75© Kong Inc.• Deployment Kong for Dev portal• Enable Kong Dev portal• Customization• Publish Specs to Portal• Publish Specs to Portal• Categorizing, Tagging and Locating Services• Role Based Access to Specs• Publish Additional Content• Developer Experience• Test the API and Managing Code Snippets• Application Registration• Mocking• DevOps Portal ManagementSummary75
THE CLOUD CONNECTIVITY COMPANY76© Kong Inc. 76Thank you