B2B-Commerce-DeveloperのPDF問題集で2024年04月21日最近更新された問題
B2B-Commerce-Developer試験問題有効なB2B-Commerce-Developer問題集PDF
Salesforce認定B2B Commerce開発者になるには、候補者は65%の最低合格スコアで60質問の複数選択試験に合格する必要があります。この試験では、B2B Commerceアーキテクチャ、データモデリング、セキュリティ、カスタマイズ、他のSalesforce製品との統合など、さまざまなトピックをカバーしています。また、候補者は、HTML、CSS、JavaScriptなどのWeb開発テクノロジーの操作の経験や、オブジェクト指向のプログラミング概念の知識も期待されています。
Salesforce B2B-Commerce-Developer試験は、多岐にわたる難易度の高い試験であり、多くの準備と勉強が必要です。この試験を受験する前に、少なくとも6か月間Salesforce B2B Commerce Cloudでの作業経験があることが推奨されます。さらに、Apex、Visualforce、Lightningコンポーネントを含むSalesforceプラットフォームの基礎の堅固な理解が必要です。
質問 # 25
What isthe difference between Gross Layout Overrides and Subscriber Templates?
- A. Subscriber Templates allow for modification of the header and the footer, while Gross Layout Overrides allow for modification everything inside the header and footer.
- B. Gross Layout Overrides allow modification to CSS of a page, while Subscriber Templates allows for modification of the entire page including header and footer.
- C. Gross Layout Overrides allow for the modification of the footer, while Subscriber Templates allow for modification of everything inside the header and footer.
- D. Subscriber Templates allows for modification of the header, the footer and the content in between them.
Gross Layout Overrides only allow for modification of the header and footer.
正解:A
解説:
Explanation
The difference between Gross Layout Overrides and Subscriber Templates is that Subscriber Templates allow for modification of the header and the footer, while Gross Layout Overrides allow for modification everything inside the header and footer. Subscriber Templates are custom Visualforce pages that can replace the standard header and footer components on a page. Gross Layout Overrides are custom Visualforce pages that can replace the default layout of a page, such as the number of columns, the position of widgets, or the content of sections. Salesforce References: B2B Commerce and D2C Commerce Developer Guide, Subscriber Templates, Gross Layout Overrides
質問 # 26
How should a developer get the grand total amount, including shipping and tax, for items in the cart and in the currency of the cart, when developing a new Lightning web component for an Aura storefront cart page?
- A. {ICart.Totals.grand Total}
- B. {ICart.Details.Fields.grandTotal}
- C. {!Cart.Details.grandTotal}
- D. {!Cart.Fields.grandTotal}
正解:B
解説:
Explanation
According to the B2B Commerce Developer Guide, the ICart interface provides access to the cart object and its related data. The Details property of the ICart interface returns an ICartDetails object, which contains information about the cart such as the currency, the subtotal, the shipping cost, the tax, and the grand total. The Fields property of the ICartDetails interface returns a map of field names and values for the cart object.
Therefore, to get the grand total amount for items in the cart and in the currency of the cart, a developer should use the expression {ICart.Details.Fields.grandTotal}, which returns the value of the grandTotal field from the cart object. References: B2B Commerce Developer Guide, ICart Interface, ICartDetails Interface
質問 # 27
Which method is used to override when extending the Salesforce B2B Commerce logic providers?
- A. process
- B. doAction
- C. doLogic
- D. fetch
正解:A
質問 # 28
For which two reasons is it preferable to extend the Salesforce B2B Commerce remote invocation object instead of using the standard Salesforce remote action invocation manager (2 answers)
- A. Salesforce B2B Commerce includes do not support standard SalesForce remote actions.
- B. The Salesforce B2B Commerce logger cannot be utilized in standard remote actions
- C. The APEX method called by the remote action will be passed as a Salesforce B2B Commerce context object.
- D. A standard remote action will not have access to Salesforce B2B Commerce objects.
正解:B、C
解説:
It is preferable to extend the Salesforce B2B Commerce remote invocation object instead of using the standard Salesforce remote action invocation manager for two reasons:
The APEX method called by the remote action will be passed as a Salesforce B2B Commerce context object, which contains useful information such as the current user, cart, storefront, and configuration settings. This can simplify the development and testing of the remote action.
The Salesforce B2B Commerce logger can be utilized in the remote action, which allows logging messages and errors to the debug log or to a custom object. This can facilitate debugging and troubleshooting of the remote action.
質問 # 29
Numerous flags ... have a directimpact on the result set provided by the Global API's. What Global API Data-Sizing convention flag prevents an API request from propagating to further requests when provided as a Boolean parameter with a value of true?
- A. ccrz.ccAPI.SZ_ASSC
- B. ccrz.ccAPI.SZ_REL
- C. ccrz.ccAPISizing.ASSC
- D. ccrz.ccAPISizing.REL
正解:A
解説:
The Global API Data-Sizing convention flag that prevents an API request from propagating to further requests when provided as a Boolean parameter with a value of true is ccrz.ccAPI.SZ_ASSC. This flag indicates that only one API request should be executed with the specified sizing block, and any subsequent requests should use their own default sizing blocks. For example, ccrz.ccServiceCart.getCart(ccrz.ccAPI.SZ_L,true) will use the SZ_L sizing block for retrieving the cart data, but any other requests that are triggered by this method will use their own default sizing blocks. Salesforce Reference: B2B Commerce and D2C Commerce Developer Guide, Data Sizing Conventions
質問 # 30
In a B2B Commerce store, which three tasks must a developer complete to implement the use of a third-party service for either tax, shipping, or pricing calculation?
- A. Create an Apex class with an invocable method
- B. Create a named credential for authentication with an external service
- C. Create an Apex class implementing the appropriate interface.
- D. Register an Apex class as the integration in the store administration
- E. Create a flow to call the external service directly
正解:B、C、D
解説:
Explanation
To implement the use of a third-party service for either tax, shipping, or pricing calculation in a B2B Commerce store, a developer must complete these three tasks:
* Create an Apex class that implements the appropriate interface for the calculation type. For example, for tax calculation, the developer must implement the sfdc_checkout.CartTax interface and define the getTax method. This method takes a Cart object as an input parameter and returns a list of CartTax objects with the calculated tax amounts.
* Create a named credential for authentication with the external service. A named credential specifies the URL of a callout endpoint and its required authentication parameters. The developer can use the named credential in the Apex class to make the callout to the external service and handle the response.
* Register the Apex class as the integration in the store administration. The developer must specify the Apex class name in the corresponding field for the calculation type. For example, for tax calculation, the developer must enter the Apex class name in the Tax Calculation Integration field. This way, the store can invoke the Apex class to perform the calculation for each cart.
The other options are not valid tasks for implementing the use of a third-party service. Creating a flow to call the external service directly is not supported for B2B Commerce, and creating an Apex class with an invocable method is not required for the calculation integration. References:
* Integrate with External Services
* CartTax Interface
* Named Credentials
* [Store Administration]
質問 # 31
Which element can be used to pass HTML from a parent component to a child component? 03m 19s
- A. <template></template>
- B. <slot></slot>
- C. <p></p>
- D. <html></html>
正解:B
解説:
Explanation
To pass HTML from a parent component to a child component, the child component needs to have a <slot></slot> element in its template. A slot is a placeholder for markup that a parent component passes into a component's body. Slots are part of the Web Component specification. The parent component can use the slot name or the default slot to specify which HTML content goes into which slot of the child component. The other options are not valid elements for passing HTML from parent to child. References:
* Slots
* Pass HTML Markup From Parent TO CHILD In Lightning Web Component
* How parent component pass HTML to child component in Angular?
質問 # 32
Witch static method invocation is used to initialize ccrz.cc_CallContext with information from ccrz.cc_RemoteActionContext and return an instance of ccrz.cc_RemoteActionResult in an apex
@RemoteAction methos?
- A. ccrz.cc_CallContext.initRemoteActionContext(ccrz.cc_RemoteActionContext)
- B. ccrz.cc_CallContext.init(ccrz.cc_RemoteActionContext)
- C. ccrz.cc_CallContext.initializeCallContext(ccrz.cc_RemoteActionContext)
- D. ccrz.cc_CallContext.initCallContext(ccrz.cc_RemoteActionContext)
正解:D
解説:
Explanation
The static method invocation that is used to initialize ccrz.cc_CallContext with information from ccrz.cc_RemoteActionContext and return an instance of ccrz.cc_RemoteActionResult in an Apex
@RemoteAction method is ccrz.cc_CallContext.initCallContext(ccrz.cc_RemoteActionContext). This method takes in a ccrz.cc_RemoteActionContext object as a parameter and returns a ccrz.cc_RemoteActionResult object. The ccrz.cc_RemoteActionContext object contains information about the current storefront, user, cart, price list, currency, locale, and session. The ccrz.cc_RemoteActionResult object contains information about the status, result, and errors of the remote action. The other methods are not valid or do not exist. Salesforce References: B2B Commerce Developer Guide: cc_CallContext Class, B2B Commerce Developer Guide:
cc_RemoteActionContext Class, B2B Commerce Developer Guide: cc_RemoteActionResult Class
質問 # 33
How can the display of CC Menu Items be customized for different users?
- A. cc_hk_Menu extension to post-process any cached menu items
- B. cc_hk_Category extension to pre-process which category items are cached as menu items
- C. cc_hk_Menu extension to pre-process which menu items are cached
- D. cc_hk_Category extension to post-process any cached menu items
正解:A
解説:
The display of CC Menu Items can be customized for different users by using the cc_hk_Menu extension to post-process any cached menu items. This extension allows modifying the menu items based on the user context, such as the user role, account, or cart. For example, the extension can hide or show certain menu items based on the user's permissions or preferences.
質問 # 34
A Northern Trail Qutfitters (NTO) developer made a tile component. To expose a click event and react to user input using the markup below, what should replace <CLICK_EVENT>?
- A. tileClick()
- B. {event:tileClick}
- C. javascript:avoid(0);tileClick();
- D. {tileClick}
正解:A
解説:
Explanation
To expose a click event and react to user input in a Lightning web component, the developer should use a method name as the value of the onclick attribute in the template. The method name should be followed by parentheses, as in tileClick(). This syntax indicates that the method is invoked when the element is clicked.
The method should be defined in the JavaScript file of the component, and it can access the event object as a parameter. The other options are either invalid or incorrect. For example, {event:tileClick} is not a valid syntax for an onclick attribute, javascript:avoid(0);tileClick(); is unnecessary and outdated, and {tileClick} is a property binding expression, not a method invocation. References: B2B Commerce and D2C Commerce Developer Guide, Lightning Web Components Developer Guide
質問 # 35
A developer is working in Visual Studio Code on a previously deployed project which is rather large and deployments are time consuming. The developer wants to know if a CSS file containing small changes was actually deployed to the org. What is one way this can be accomplished?
- A. Right-click the CSS file and choose Diff File Against Org
- B. Click the Tools menu and select Diff Styles Against Org...
- C. Right-click the folder for the component and choose Diff Files Against Org
- D. Right-click the folder for the component and choose Diff Styles Against Org
正解:A
解説:
To know if a CSS file containing small changes was actually deployed to the org, one way that a developer can accomplish this is by right-clicking the CSS file and choosing Diff File Against Org. Diff File Against Org is an option that allows the developer to compare a local file with its remote version in the org using Salesforce CLI commands. The developer can use Visual Studio Code to execute these commands by right-clicking on files or folders in the project and choosing from various diff options. Right-clicking the CSS file and choosing Diff File Against Org allows the developer to see the differences between the local CSS file and the remote CSS file in the org side by side in Visual Studio Code. This way, the developer can verify if their changes were deployed successfully or not. Clicking the Tools menu and selecting Diff Styles Against Org... is not a valid way to know if a CSS file was deployed to the org, as there is no such option in Visual Studio Code or Salesforce CLI. Right-clicking the folder for the component and choosing Diff Styles Against Org is not a valid way either, as there is no such option in Visual Studio Code or Salesforce CLI. Right-clicking the folder for the component and choosing Diff Files Against Org is not a valid way either, as it will compare all the files in the folder, not just the CSS file, which may not be efficient or necessary. Salesforce Reference: [Salesforce CLI Command Reference: force:source:diff], [Salesforce Developer Tools for Visual Studio Code]
質問 # 36
What are two considerations to keep in mind when including additional JavaScript files in a Lightning web component?
- A. Each additional file needs a corresponding .js-meta.xml file.
- B. Additional JavaScript files should be minified before deployment
- C. The files must be ES6 modules and must have names that are unique within the component's folder.
- D. A module can export named functions or variables
正解:C、D
解説:
When including additional JavaScript files in a Lightning web component, a developer should keep in mind two considerations: the files must be ES6 modules and must have names that are unique within the component's folder and a module can export named functions or variables. The files must be ES6 modules because LWC uses ES6 modules as the standard for modular JavaScript code. The files must have names that are unique within the component's folder because LWC uses the file name as the module identifier and does not allow duplicate identifiers. A module can export named functions or variables because LWC supports named exports, which allow a module to export multiple values with different names. Each additional file does not need a corresponding .js-meta.xml file, as this is only required for the main JavaScript file of the component. Additional JavaScript files should not be minified before deployment, as this is not necessary or recommended for LWC. Salesforce Reference: [Lightning Web Components Developer Guide: Include JavaScript Files], [Lightning Web Components Developer Guide: ES6 Modules]
質問 # 37
Which three steps are necessary to have subscriberpage added to Salesforce B2B Commerce after creating a custom Visualforce page? (3 answers)
- A. Create a new CC Subscriber Page record that points to your custom Visualforce page.
- B. Enable the Subscriber Page in CC Admin.
- C. Create a new Visualforce page, and manually import the Salesforce B2BCommerce JavaScript libraries.
Run in Anonymous Apex ccrz.cc_util_Reflection.upsertPageUIKey([arg1],[arg2],[arg3]); - D. Refresh the Page Keys Index in CC Admin.
正解:A、B、D
解説:
Explanation
Three steps that are necessary to have a subscriber page added to Salesforce B2B Commerce after creating a custom Visualforce page are:
* Create a new CC Subscriber Page record that points to your custom Visualforce page. This record will store information about the subscriber page, such as the name, description, URL, and Visualforce page.
For example, you can create a new record named MySubscriberPage that points to your custom Visualforce page named MyPage.
* Refresh the Page Keys Index in CC Admin. This action will update the page keys index, which is a cache that stores the mapping between the page keys and the subscriber pages. You need to do this whenever you create or modify a subscriber page record.
* Enable the Subscriber Page in CC Admin. This action will allow you to select the subscriber page from the CC Page Settings configuration and assign it to a CC Page. For example, you can enableMySubscriberPage and assign it to the Home page. Salesforce References: B2B Commerce and D2C Commerce Developer Guide, Subscriber Pages
質問 # 38
A developer has made a component with a lightning combobox in the follow! markup. To handle changes on the combobox, what should replace <CHANGE FVENT>?
- A. javascript:void(0);handleChange();
- B. {handleChange()}
- C. {handleChange}
- D. {event:handleChange}
正解:C
解説:
To handle changes on the combobox, the developer should replace <CHANGE EVENT> with {handleChange}. The handleChange is a function that is defined in the JavaScript file of the Lightning web component and is invoked when the value of the combobox changes. The developer can use this function to perform custom logic or actions based on the selected value of the combobox, such as updating other components or properties, calling Apex methods or services, or firing events. The developer can use the onchange attribute to bind the handleChange function to the combobox element in the HTML file of the Lightning web component. The onchange attribute is an HTML attribute that specifies a function to be executed when the value of an element changes. {event:handleChange} is not a valid way to handle changes on the combobox, as it is not a valid syntax for binding a function to an element. javascript:void(0);handleChange(); is not a valid way either, as it is not a valid syntax for binding a function to an element. {handleChange()} is not a valid way either, as it is not a valid syntax for binding a function to an element. Salesforce Reference: Lightning Web Components Developer Guide: Handle Events, Lightning Web Components Developer Guide: Communicate with Properties, Lightning Web Components Developer Guide: lightning-combobox
質問 # 39
What is the recommended method for increasing the number of required autocomplete characters that are typed before autocomplete works?
- A. Update the...minLength property in CC Admin, then build and activate a new cache.
- B. Override theautoComplete.search_input.minLength value in the CCRZ.uiProperties file
- C. Override the autocomplete template and create and register a new handlebars helper.
- D. Override and extend the autoComplete method in cc_hk_Catalog.
正解:B
解説:
Explanation
The recommended method for increasing the number of required autocomplete characters that are typed before autocomplete works is to override the autoComplete.search_input.minLength value in the CCRZ.uiProperties file. This file contains various properties that control the behavior and appearance of the user interface components. The autoComplete.search_input.minLength property specifies the minimum number of characters that must be entered before the autocomplete feature is triggered. The default value is 3, but it can be changed to any desired value by overriding it in the CCRZ.uiProperties file. Salesforce References: B2B Commerce and D2C Commerce Developer Guide, UI Properties
質問 # 40
Which two statements are true regarding the cc_CallContext class in Salesforce B2B Commerce? (2 answers)
- A. The class can be used internally within Salesforce B2B Commerce and in subscriber code to access context level parameters
- B. The current storefront is accessible via thisclass
- C. The Salesforce session is accessible via the getSession method
- D. The userLocale variable returns the current Locale for storefront.
正解:A、B
解説:
The cc_CallContext class is a utility class that provides access to various context level parameters, such as the current storefront, user, cart, price list, currency, locale, and session. The class can be used internally within Salesforce B2B Commerce and in subscriber code to access these parameters. The current storefront is accessible via this class by using the getStorefront method, which returns a cc_Storefront__c object. The userLocale variable returns the current Locale for storefront, but it is not part of the cc_CallContext class. It is a global variable that can be accessed from any Visualforce page or component by using {!userLocale}. The Salesforce session is accessible via the getSession method, but it is not part of the cc_CallContext class either. It is a method of the cc_SessionUtil class, which is another utility class that provides methods for managing sessions. Salesforce Reference: [B2B Commerce Developer Guide: cc_CallContext Class], [B2B Commerce Developer Guide: cc_SessionUtil Class]
質問 # 41
Which method is used to override when extending the Salesforce B2B Commerce logic providers?
- A. doAction
- B. doLogic
- C. process
- D. fetch
正解:A
解説:
Explanation
The method that is used to override when extending the Salesforce B2B Commerce logic providers is doLogic.
This method is responsible for executing the business logic for each logic provider class, such as validating inputs, performing calculations, applying rules, or updating data. By overriding this method, the user can modify or extend the existing logic or add their own custom logic. Salesforce References: B2B Commerce and D2C Commerce Developer Guide, Logic Classes
質問 # 42
Which three statements are true about Global API versioning? (3 answers)
- A. The API version is scoped at the Class API level and NOT at the method level.
- B. Minimum API_VERSION is 1 and the Maximum API version follows the releases. E.g. The maximum was 4 as of Salesforce B2B Commerce Release-4.5, 5 as of Salesforce B2B Commerce Release 4.6, etc.
- C. Calling in with an API version set to lower than 1 will result in an exceptional case where the exception class ccrz.BelowMinAPIVersionException will be returned to callers.
- D. Calling in with an API version set to more than current maximum will result in exception case where the exception class ccrz.ExceedsMaxAPIVersionException will be returned to callers.
- E. There is no need to pass API_VERSION to the Global APIs, and based on the Salesforce B2B Commerce Managed Package version, Global APIs are able to figure out what version of the API to use.
正解:B、C、D
質問 # 43
How are variables bound when services use the ccSercviceDao classto execute queries?
- A. Global variables
- B. Apex class variables
- C. String substitution
- D. Apex local variables
正解:C
解説:
Explanation
When services use the ccServiceDao class to execute queries, variables are bound by string substitution. This means that the query string contains placeholders for variables that are replaced by their values at runtime. For example, ccrz.ccServiceDao.getQuery('SELECT Id FROM Account WHERE Name = :name') will replace :name with the value of the name variable.
質問 # 44
A developer is working in Visual Studio Code on a previously deployed project which is rather large and deployments are time consuming. The developer wants to deploy some small CSS changes without waiting for the entire project deployment. What are two ways this can be accomplished?
- A. Deploy the entire project. Only the change will be copied
- B. Right-click the folder for the component and choose Deploy Source to Org
- C. Click the Tools menu and select Deploy styles
- D. Right-click the CSS file and choose Deploy Source to Org
- E. Right-click the CSS file that was edited and select Deploy Single File
正解:B、E
解説:
Two ways that a developer can deploy some small CSS changes without waiting for the entire project deployment are right-clicking the folder for the component and choosing Deploy Source to Org and right-clicking the CSS file that was edited and selecting Deploy Single File. Deploying source to org is a way of deploying metadata from a local project to an org using Salesforce CLI commands. The developer can use Visual Studio Code to execute these commands by right-clicking on files or folders in the project and choosing from various deployment options. Right-clicking the folder for the component and choosing Deploy Source to Org allows the developer to deploy only the files that belong to that component, such as HTML, JavaScript, CSS, and XML files. Right-clicking the CSS file that was edited and selecting Deploy Single File allows the developer to deploy only that CSS file and not any other files in the project. These options can save time and bandwidth for deploying small changes without affecting other components or files in the project. Modifying the StoreIntegratedService to map to an Apex class ID using Workbench is not a way of deploying CSS changes, as it is only used for registering internal services that are provided by Salesforce B2B Commerce out-of-the-box. Entering the integration class name and version in store administration is not a way of deploying CSS changes either, as it is only used for selecting an existing integration class that has already been registered as an external service. Salesforce Reference: Salesforce CLI Command Reference: force:source:deploy, Salesforce Developer Tools for Visual Studio Code, B2B Commerce Developer Guide: Integration Framework, B2B Commerce Developer Guide: RegisteredExternalService Object
質問 # 45
Northern Tail Outfitters (NTO) is converting an existing aura component into a Lightning Web Component. The aura component has the following source code:
What is the equivalent of this code in a Lightning Web Component?
- A.

- B.

- C.

- D.

正解:C
解説:
The equivalent of this code in a Lightning web component is option B. Option B uses the @api decorator to expose firstName as a public property of the Lightning web component and communicate it with other components or services. The @api decorator is a decorator that marks a property or method as public, which means that it can be accessed by other components or services that use or consume this component. The @api decorator also makes the property reactive, which means that it can track changes and update the component accordingly. In option B, firstName is exposed as a public property using the @api decorator and passed to the child element using an attribute. Option A is incorrect because it uses an invalid syntax for exposing firstName as a public property. The @api decorator should be used before the property declaration, not after it. Option C is incorrect because it uses an invalid syntax for exposing firstName as a public property. The @api decorator should be used with parentheses, not without them. Option D is incorrect because it uses an invalid syntax for exposing firstName as a public property. The @api decorator should be used with camel case, not with hyphens. Salesforce Reference: Lightning Web Components Developer Guide: Communicate with Properties, Lightning Web Components Developer Guide: Decorators
質問 # 46
What is the recommended method for increasing the number of required autocomplete characters that are typed before autocomplete works?
- A. Override the autoComplete.search_input.minLength value in the CCRZ.uiProperties file
- B. Update the...minLength property in CC Admin, then build and activate a new cache.
- C. Override the autocomplete template and create and register a new handlebars helper.
- D. Override and extend the autoComplete method in cc_hk_Catalog.
正解:A
質問 # 47
Which Global JavaScript Object should be extended when
writing custom Remote Actions?
- A. CCRZ.cc_CallContext
- B. CCRZ.RemoteInvocation
- C. CCRZ.cc
- D. CCRZ.
正解:C
解説:
Explanation
The Global JavaScript Object that should be extended when writing custom Remote Actions is CCRZ.cc. This object contains all the Remote Actions that are defined in the cloudcraze managed package, which can be overridden or extended by subscriber code. The object also provides a mechanism for registering custom Remote Actions that can be invoked by the user interface components. For example, CCRZ.cc.customAction = function(params, callback){ // do something } will define a custom Remote Action named customAction that can be called by CCRZ.cc.customAction(params, callback). Salesforce References: B2B Commerce and D2C Commerce Developer Guide, Remote Actions
質問 # 48
Which Salesforce B2B Commerce object needs to have a record added when defining a new Subscriber Pages to be rendered in a CC Page?
- A. CC Subscriber Pages
- B. CC Admin
- C. CC Storefront Assosiation
- D. CC Page Sections
正解:A
質問 # 49
......
Salesforce認定B2B Commerce Developer認定試験は、60の質問で構成される複数選択試験です。試験はタイミングがあり、105分間続きます。候補者は、試験に合格するには、65%以上のスコアを達成する必要があります。試験料は200ドルで、候補者はSalesforce Webサイトを通じて試験に登録する必要があります。
B2B-Commerce-Developer問題集合格確定させる練習には179問があります:https://www.goshiken.com/Salesforce/B2B-Commerce-Developer-mondaishu.html
B2B-Commerce-Developer練習テスト問題解答更新された179問があります:https://drive.google.com/open?id=1lQ2vv1Yo2iYuQA6Hxshw3Y2MHqM0QZdj