Quantcast
Channel: SCN : All Content - SAP Gateway
Viewing all 2823 articles
Browse latest View live

how to pass multiple single entry for a variable in odata

$
0
0

/sap/opu/odata/sap/TESTQUERY_SRV/TESTQUERY(ZTCOUNTRY_SSV='ZZ')/Results

 

Hi Gurus,

 

I want to pass multiple values single values for my variable on bw query

eg: ZTCOUNTRY_SSV='ZZ'  and ZTCOUNTRY_SSV='AA'

 

 

Is this possible? What should be the syntax in URL?

 

Kindly help

 

Regards,

Preeti


How to Enhance ODATA Service

$
0
0

Hi Experts,

 

I am trying to enhance Work Force Viewer of My Team UI5 Application

 

OData Service

HROVIS_ORGCHART_SERVICE

 

I need to show only a few buttons and buttons logic is there in Data Provider Class(DPC) - 

CL_HROVIS_GW_RT_ORGCHART

 

As it is standard class, i am not able to edit which means i have to know the process of enhancing this ODATA & Data Provider Class

 

Please let me know the process of Enhancing ODATA & DPC Classes.

File Attachment using gateway

$
0
0

Hi Everyone,

     New scenario: uploading and downloading file using SAP Netweaver Gateway .

 

Dont know how to solve this  one .

I like to have ur valuable suggestion and Advice for this requirement.

 

 

Thanks in Advance,

 

Regards,

Jibin JOy

Exploring Multiple Origin using System ID and Client

$
0
0

While working with Multi Origin in service URL we have to pass additional parameter SAP_Origin (i.e. nothing but your system alias pointing to corresponding ECC) in filter and Get entity operation.

 

When working on same scenarios i found one interesting possibility of passing the System ID (SID) and Client (of ECC) and fetch data from particular system.

 

What is Multi Origin?

 

Multiple origin is used to fetch data from different back-end systems, collect them in one single service and updating different back-end systems using the same user.

 

Why System ID and Client?

 

  • When creating OData requests you might not have information on any SAP NetWeaver Gateway system alias.
  • You might wish to refrain from exposing the system name of your SAP NetWeaver Gateway system in the URL of your service for security reasons. In this case, instead of the system name you can also use the system ID (SID) together with the corresponding client.

 

Pre-Requisite :

 

  • Gateway system is connected to all back end system
  • System alias is available for all back end system
  • GW Project is created in all the back end system
  • Add all system alias in T-code /n/IWFND/MAINT_SERVICE for the ZPROJECT_SRV in GW system
  • Using the URL sap/opu/odata/sap/ZPROJECT_SRV;mo/$metadata expected output is coming.


Alias eg.

FIORI_ECC1 : Backend System Alias 1 (SID - ABC, Client -100)

FIORI_ECC2 : Backend System Alias 2 (SID - XYZ, Client -100)



How to Use System ID and Client in URL ?


  • In Gateway system Open SAP Reference IMGin transaction SPROand navigate to SAP NetWeaver SAP Gateway OData Channel Configuration Connection Setting SAP Gateway to SAP System Manage SAP System Aliases

 

SPRO.PNG

 

  • Check for System Alias FIORI_ECC1 and FIORI_ECC2 in list.
  • Maintain SID and Client against System Alias


Manage SAP System.PNG

Now we are all set to test the scenario of using SID and Client in Gateway Service URl



Syntax for using SID and Client:

/sap/opu/odata/sap/ZPROJECT_SRV;o=sid(SID.Client)/EnitySet

In our case it will be:- /sap/opu/odata/sap/ZPROJECT_SRV;o=sid(ABC.100)/EnitySet

See the result which refrains output results  only from system ABC-100.


GW Client.PNG



Syntax for using System Alias:

/sap/opu/odata/sap/ZPROJECT_SRV;o=SystemAlias/EnitySet

or /sap/opu/odata/sap/ZPROJECT_SRV;mo/EnitySet?$filter=SAP_Origin eq 'SystemAlias'

In our case it will be:- /sap/opu/odata/sap/ZPROJECT_SRV;o=FIORI_ECC1/EnitySet

See the result which refrains output results  only from system alias FIORI_ECC1.


GW Client2.PNG


 

Similarly it works for create and deep create operation also.

Below I am showing an example working with create deep entity.


Create2.PNG


Create.PNG




The processing of request is as follows:

1.       The SAP NetWeaver Gateway system searches for all existing system aliases for the user and the specified service.

2.       The SAP NetWeaver Gateway system checks if one from above system aliases equals sid(ABC.100). If this is the case, this system will be used.

3.       If no such system exists underneath the specified service, then SAP NetWeaver Gateway checks whether one of the above system aliases has defined a system ID ABCand client 100.

4.       If this is the case, this system ID will be used. Otherwise an error message is displayed.



Hope this fills new developments. 

Error "In the context of Data Services an unknown internal server error occurred"

$
0
0

Dear Experts,

 

We're facing the error "In the context of Data Services an unknown internal server error occurred" as soon as we save the created tile.

 

From transaction /n/IWFND/ERROR_LOG log, we see the errors. For error information, refer the attached screenshot "Gateway_Error_Log".


And also, when we click the already created tile, then we get the error message "For technical reasons this page could not be displayed. Contact your system administrator". Refer the attached screenshot "AUDIT_PAGE".


It seems that Gateway Configuration was not done properly?


Any ideas, please?


Thanks & best regards,

Sreenu




Best Practice - ABAP CDS based ODATA services?

$
0
0

Hi community,

 

I'm looking forward to your input about the following:

 

There are 2 approaches to model OData services based on CDS viewson ABAP stack (7.4+, our system is 7.5 SP1):

 

1. The more 'traditional' SEGW way by using SADL generated runtime artifacts and referencing CDS data model

 

2. Via annotation '@OData.Publish' (SADL GTK toolkit generation)

 

Which offers the best possibility to customize reading and writing operations? Which experiences did you make? Shortcomings? Stumbling blocks?

 

Any advice on how to include BOPF objects into the approach (CDS annotations @ObjectModel.*)?

 

Every comment highly appreciated. Thanks!

 

 

 

 

Issue: Different login Pop-Up window for different services.

Unable to open SAP gateway client.

$
0
0

I  have written a odata service in recently installed gateway system which is SAP NETWEAVER VERSION 7.4 SP8. After registering the service when I tried to open the SAP Gateway client I couldnt find any session opened. When tried to click SAP Gateway client couple of times , I see a popup saying that the maximum GUI sessions have exceeded.But I dont find those many sessions opened.What could be the issue ? Could anybody please help me out here!!


How to undo merge of objects

$
0
0

Hi

 

I have a query regarding merge objects.I have captured my objects in a transport request then I have created another tr and using include objects first tr is merged in newly created tr.I want to demerge it since it was done by mistake.How can I do it?If I delete the second tr will the objects in first tr also gets deleted?Any help would be appreciated.

Enhance MPC Class in Odata

$
0
0

Hi Experts,

 

I want to add one more field to the structure -  HROVIS_S_NODE_GENERIC

 

How can I enhance my Odata Model Provider Class - CL_HROVIS_GW_MD_ORGCHART

 

I have created a Model and assigned it in Maintain Service Transaction as shown in attached image 1 but it is not working

 

I would like to understand How to know the Gateway Project name as well

Multiple File Attachments upload via Odata Service Call in GOS

$
0
0

Hi Experts,

 

We have a requirement where we need to attach multiple files with different file extensions via Odata Service Call in GOS (no Z-table).

I know that we need to redefine method CREATE_STREAM to upload files.

 

Has anyone implemented such kind of a service where multiple files attached on UI side are read in a single service call and the files are uploaded in GOS?

 

From U5 side we are using Upload Collection Entity.

SAPUI5 Explored

Odata Service for CDS View with Input Parameter

$
0
0

Hi Gurus,

 

I would needing yours expert suggestion for following problem:

 

1. I've created on CDS View with Input Parameter;

Untitled.png

2. Then I created the Service in SEGW t-code

Untitled.png

Untitled.png

3. Now when I try to execute the Odata Service for this I'm getting below error:

Untitled.png

Will be needing your expert views on this, I think I'm not correctly passing the Input parameter for the underlying CDS view, pleasw let me know how to do it.

 

Thanks and Regards,

Binay Biswakarma

Publishing an oData from CDS View with Parameters

$
0
0

Hi experts!

 

I have a CDS View with parameter that i want to publish as an oData service.

 

My view have two parameters:

 

     - GJAHR:GJAHR --> CHAR 04   

     - AFABE:AFABE_D --> CHAR 02

 

How i publish this CDS View in SEGW?

 

When i used an import by reference, it recognize the parameters, but when generating the class, i have an error (the class is generated with a blank type).

 

Ex.:

TYPES:

BEGIN OF tt_zcds_parameters.

INCLUDE TYPE . "no type is specified, and this generated an error in the class activating

 

Thanks!

Matheus Goulart

Variant Management Odata Service

$
0
0

Hi Experts,

 

Has anyone implemented Variant Management for Odata Service? Can anyone suggest the approach for saving Variants at backend via Odata service call?

 

UI Variant Management Control SAPUI5 Explored

Why not build fewer, more useful OData services?

$
0
0

Do you ever have the feeling that you are missing something obvious?


The present

 

It seems to me that the current orthodoxy is that an OData service should be developed for each UI5 app.  In other words, each app should only have to call one service.  I think we should question whether that is the best approach.

 

Of course, a UI5 app can use many OData models, so long as each one has a unique name within the app.

 

In my opinion, when developing OData services (e.g. using Netweaver Gateway or HCI OData Provisioning), we should think of the big picture.  We shouldn't be too focused on the bespoke Fiori-style app we happen to be developing that day.  In a few years time we may have a large number of Fiori apps, both standard and bespoke.  There may be many other consumers of our OData services both internal (e.g. our own company website or intranet) and external (e.g. customer or supplier systems).

 

Why not take an 'API' approach, and think of our OData services as a way of interacting with the entities in our back end system?  Why not organise the services in such a way as to make it easy to navigate for any UI developer working with any technology? For example we could have a service for customers, one for inventory and one for employees. It seems to me that this would be much more in line with the RESTful architecture.  Just because we are using an SAP technology, such as Gateway, to deliver our services, it doesn't mean we should only consider SAP UI-technologies as consumers.  A big plus of the modern web-architecture is that the UI-layer is completely de-coupled from the data-provider and I think we should take advantage of that.

 

The future

 

If we (SAP and customers) carry on developing new services at a rapid rate, within a few years I fear we will have a large number of overlapping services.  It will be so hard to find one to use that developers will simply create another brand new service rather than trying to sort through that long list.  There will be much duplication of logic.

 

Each published service represents a responsibility (does it work as it should?) and a vulnerability (could it facilitate malicious activity?).  This isn't new (the same can be said for a remote-enabled function module) but surely a very large number of services makes it harder to manage these risks.

 

Pros & Cons

 

This is my take on the pros and cons of the one-service-per app model:

 

  • Robust, as development of a service for app #2 does not affect app #1.  This helps us get an app live very quickly, and may fit in better with an agile methodology(?).  This appeals to those who found the ESOA (Enterprise Service-Orientated Architecture) approach difficult to manage in practice
  • Re-usability can be introduced via 'Concrete classes', as described by Leigh Mason hereMaking your SAP Gateway work smarter not harderand also Service Inclusion
  • Data provider classes are quite small and manageable as there are only a few entities in each service
  • The service can be optimised for the app.  However, this can probably be achieved in a generic service by using features such as $select to specify the fields required.  Also, there is nothing to say that the 'customer' service must only have one, generic 'customer' entity
  • An external 'API' productcould perhaps be used to unify and present the services provided by Gateway (and other OData providers too)
  • Will lead in time to a large number of overlapping services.  It will be hard for a UI-developer to find what they need
  • Likely there will be a lot of duplication of logic (across services), leading to greater effort and reduced maintainability.  How many times will an employee entity be required, for example, in order to provide employee names?
  • Services are designed for individual apps on one particular platform (UI5/Fiori) and might not be suitable for future apps or other UI platforms

 

What do you think?  What do you do?

 

So, is there an obvious point that I am missing?  Are there advantages of the one-service-per-app approach that I have missed?  Am I wrong to call one-service-per-app the orthodoxy?

 

What is the strategy in your organisation (or at your clients) for OData services? I look forward to your comments.


Multiple single values to a parameter in ODATA bex query

$
0
0

Hi All,

 

we have a requirement to a bex variable with several single values.

once meta data is generated,how to pass multiple single values in URI.

 

please provide syntax.

 

Your help is much appreciated.

How to get Domain And port information

$
0
0

Hi All,       I have one RFC connection ERP system in SM59. I have one FIORI app in gateway system. Now i need to provide navigation from app which is loaded in ERP to Fiori loaded in Gateway.       To do this i need Domain and port number of Gatway system.  IS there anyway to get this information in ERP ? Regards, Praveen

ODATA SERVICE FOR PURCHASE REQUISITION CREATION

$
0
0

step1) Open TCode SEGW and create a project as shown in below screen shot.

1.png

Provide the following details


2.png

Then the components like

  1. 1. Data Model
  2. 2. Service Implementation
  3. 3. Runtime Artifacts
  4. 4. Service Maintenance

Gets displayed automatically.


step2. Create an entity type as follows

4.png

Provide as following.


5.png

6.png

Click on properties as shown below.

7.png

 

Add the following values for header as shown below

9.png

Same way create entity type PR_Item for the item also and give the following values

10.png

step3. Create an entityset as shown below.

11.png

Give the following details

12.png

Then Header Entityset is created.

13.png

     Same way create for Item Entityset is created.

14.png

step 4. Create a association as shown below.

15.png


16.png

17.png

18.png

19.png

And association set is automatically created.

step 5. Now Navigation is automatically created.

20.png

step 6.After completion of data model in Odata service in Service Implementation is filled automatically as shown in below screen shot.

21.png

step 7.Now we need to generate runtime artifacts ,for that you need to select Runtime Artifacts and click on

 

22.png

 

Click OK and save it.

24.png

We get the following in Runtime Artifacts .

25.png

step 8. We need write in ZCL_Z_PURCHASE_REQUISI_DPC_EXT so double click on it .

 

27.png

step 9 A.Then we need to right click on the methods and redefine required methods in following process.

28.png

And write following code  to get entity .


29.png

Code for Get Entity

 

 

 

 

 

method PRHEADERCOLLECTI_GET_ENTITY.

 

DATA: LS_KEY_TAB LIKE LINE OF IT_KEY_TAB.

 

     READ TABLE it_key_tab INTO ls_key_tab WITH KEY name ='PRNumber'.

 

ER_ENTITY-prnumber = LS_KEY_TAB-VALUE.

*    lv_pR_item = ls_key_tab-value.

**TRY.

*CALL METHOD SUPER->PRHEADERCOLLECTI_GET_ENTITY

*  EXPORTING

*    IV_ENTITY_NAME          =

*    IV_ENTITY_SET_NAME      =

*    IV_SOURCE_NAME          =

*    IT_KEY_TAB              =

**    io_request_object       =

**    io_tech_request_context =

*    IT_NAVIGATION_PATH      =

**  IMPORTING

**    er_entity               =

**    es_response_context     =

*    .

** CATCH /iwbep/cx_mgw_busi_exception .

** CATCH /iwbep/cx_mgw_tech_exception .

**ENDTRY.

endmethod.

 

 

 

9 B. Likewise redefine other required methods PRITEMCOLLECTION_GET_ENTITYSET and deep insert  also in same way  .

 

 

Code for GET_ENTITYSET

*** inactive new ***

METHOD PRITEMCOLLECTION_GET_ENTITYSET.

DATA:        ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,

            lv_pr_number TYPE BANFN,

            lv_pr_item TYPE BNFPO,

            lt_pr_items_bapi TYPE TABLE OF BAPIEBAN,

            ls_pr_item_bapi TYPE BAPIEBAN,

            IT_RETURN TYPE STANDARD TABLE OF BAPIRETURN.

TYPES:

BEGIN OF ts_pr_item,

     PRITEM type C length 5,

     PURGROUP type C length 3,

     MATERIAL type C length 18,

     SHORTTEXT type C length 40,

     PLANT type C length 4,

     MATERIALGROUP type C length 9,

     QUANTITY type P length 7 decimals 3,

     UNIT type C length 3,

     DOCUMENTTYPE type C length 4,

     DELIVERYDATE type TIMESTAMP,

     ITEMCATEGORY type C length 1,

     ACCTASSIGNCATEGORY type C length 1,

     PRNUMBER type C length 10,

END OF ts_pr_item.

*

DATA: es_entityset LIKE LINE OF ET_ENTITYSET.

*

READ TABLE it_key_tab INTO ls_key_tab WITH KEY name ='PRNumber'.

lv_pR_number = ls_key_tab-value.

*

READ TABLE it_key_tab INTO ls_key_tab WITH KEY name ='PRItem'.

lv_pR_item = ls_key_tab-value.

 

CALL FUNCTION 'BAPI_REQUISITION_GETDETAIL'

EXPORTING

number =  lv_pr_number

tables

requisition_items =   lt_pr_items_bapi

RETURN =   IT_RETURN

          .

*DELETE lt_pr_items_bapi WHERE preq_item NE lv_pr_item.

*

READ TABLE lt_pr_items_bapi INTO ls_pr_item_bapi INDEX 1.

*

LOOP AT lt_pr_items_bapi INTO ls_pr_item_bapi.

*

      es_entityset-PRITEM = ls_pr_item_bapi-PReq_ITEM.

      es_entityset-PURGROUP = ls_pr_item_bapi-PUR_GROUP.

      es_entityset-material = ls_pr_item_bapi-material.

      es_entityset-SHORTTEXT = ls_pr_item_bapi-short_text.

      es_entityset-plant = ls_pr_item_bapi-plant.

      es_entityset-MATERIALGROUP = ls_pr_item_bapi-mat_grp.

      es_entityset-quantity = ls_pr_item_bapi-quantity .

      es_entityset-UNIT = ls_pr_item_bapi-unit .

      es_entityset-DOCUMENTTYPE = ls_pr_item_bapi-doc_type .

      es_entityset-ITEMCATEGORY = ls_pr_item_bapi-item_cat .

      es_entityset-ACCTASSIGNCATEGORY = ls_pr_item_bapi-acctasscat .

      es_entityset-PRNUMBER = ls_pr_item_bapi-preq_no .

      es_entityset-DeliveryDate = ls_pr_item_bapi-deliv_date .

 

      APPEND es_entityset TO et_entityset.

      CLEAR: es_entityset.

*

ENDLOOP.

  1. ENDMETHOD.

 

 

CODE FOR CREATE_DEEP_ENTITY

 

method /IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY.

**TRY.

*CALL METHOD SUPER->/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY

*  EXPORTING

**    iv_entity_name          =

**    iv_entity_set_name      =

**    iv_source_name          =

*    IO_DATA_PROVIDER        =

**    it_key_tab              =

**    it_navigation_path      =

*    IO_EXPAND               =

**    io_tech_request_context =

**  IMPORTING

**    er_deep_entity          =

*    .

** CATCH /iwbep/cx_mgw_busi_exception .

** CATCH /iwbep/cx_mgw_tech_exception .

**ENDTRY.

 

     DATA: lv_new_pr_no TYPE BAPIEBANC-PREQ_NO.

*             ls_new_pr_header TYPE BAPIMEREQHEADER.

 

DATA: ls_bapi_item TYPE bapiebanc,

          lt_bapi_item TYPE TABLE OF bapiebanc,

          lt_return TYPE TABLE OF bapiret2.

 

TYPES: ty_t_pr_items TYPE TABLE OF zcl_z_purchase_requisi_mpc=>ts_pr_item WITH DEFAULT KEY.

 

TYPES: BEGIN OF ts_pr_items.

            INCLUDE TYPE zcl_z_purchase_requisi_mpc=>ts_pr_header.

TYPES: PrItemCollection TYPE ty_t_pr_items,

           END OF ts_pr_items.

 

DATA: lt_items TYPE zcl_z_purchase_requisi_mpc=>tt_pr_header,

          ls_item  TYPE zcl_z_purchase_requisi_mpc=>ts_pr_item,

          lt1_items type ty_t_pr_items,

          ls_pritems TYPE ts_pr_items.

 

DATA: ls_data TYPE ts_pr_items.

 

CALL METHOD io_data_provider->read_entry_data( IMPORTING es_data = ls_data ).

*    ls_item-PRItemCollection  = ls_data-PrItemCollection.

lt1_items  = ls_data-PrItemCollection.

*append ls_item to it_items.

*clear ls_item.

 

 

*    LOOP AT lt_items INTO ls_item.

LOOP AT lt1_items INTO ls_item.

 

      ls_bapi_item-material = ls_item-material.

      ls_bapi_item-plant = ls_item-plant.

      ls_bapi_item-quantity = ls_item-quantity.

      ls_bapi_item-doc_type = ls_item-DocumentType.

      ls_bapi_item-DELIv_DATE = ls_item-DeliveryDate.

      ls_bapi_item-PUR_GROUP = ls_item-PURGROUP.

      ls_bapi_item-PREQ_ITEM = ls_item-PRITEM.

      ls_bapi_item-SHORT_TEXT = ls_item-SHORTTEXT.

      ls_bapi_item-MAT_GRP = ls_item-MATERIALGROUP.

      ls_bapi_item-UNIT = ls_item-UNIT.

      ls_bapi_item-ITEM_CAT = ls_item-ITEMCATEGORY.

      ls_bapi_item-ACCTASSCAT = ls_item-ACCTASSIGNCATEGORY.

      ls_bapi_item-PREQ_NO = ls_item-PRNUMBER.

*      ls_itemx-po_item = ls_item-item.

      APPEND ls_bapi_item TO lt_bapi_item.

*      APPEND ls_itemx TO lt_itemx.

      CLEAR ls_item.

ENDLOOP.

 

 

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

INPUT         = lv_new_pr_no

IMPORTING

OUTPUT        = lv_new_pr_no

          .

CALL FUNCTION 'BAPI_REQUISITION_CREATE'

* EXPORTING

* SKIP_ITEMS_WITH_ERROR =

* AUTOMATIC_SOURCE = 'X'

IMPORTING

NUMBER = lv_new_pr_no

TABLES

requisition_items = lt_bapi_item

RETURN = lt_return

      .

 

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

      EXPORTING

        wait = 'X'.

*    MOVE-CORRESPONDING ls_headerdata TO ls_pritems.

ls_pritems-prnumber = lv_new_pr_no.

 

copy_data_to_ref(

      EXPORTING

        is_data = ls_pritems

      CHANGING

        cr_data = er_deep_entity ).

endmethod.

 

step10: Now Service Maintenance is automatically created but we need to register the service. So select the system i.e. EC7 and click on register.


30.png

Give the system Alias LOCAL_GW and click OK. Then Maintain The register

step 11.Test the service

 

Provide the following query

/sap/opu/odata/SAP/Z_PURCHASE_REQUISITION_TEST_SRV/PRHeaderCollection('0010003245')?$expand=PRItemcollection

33.png

Click on Use as Request.

34.png

Then you will get the response as request on left side

For Purchase Requisition creation you need to remove the Purchase Requisition number from left side.

35.png

/sap/opu/odata/SAP/Z_PURCHASE_REQUISITION_TEST_SRV/PRHeaderCollection() in gateway client and click on post

Purchase Requisition is created ‘0010017270’ as shown in below screen shot.


36.png

Check in Table level entries in EBAN we can find the Purchase Requisition '0010017270'


Upload Images into SAP DMS using Gateway/UI5

$
0
0

Dear SAP Gurus,

 

We have a requirement to upload images into SAP DMS using UI5 application. I've checked on UI5 and we can pass a File object as shown below to Gateway. I'm using

 

UI5.png

There are many threads on passing images to Gateway but I'm unable to figure out how can we use the Image object in Gateway to create a SAP DMS document. I checked this thread that talks about uploading PDF in DMS but does not explain on how to create the document in DMS.

 

 

Is there any way to create documents into SAP DMS using Image as BINARY/BASE64 OR XSTRING/STRING. Please note I cannot pass image file location as C:\Image\sap.jpg

 

Regards,

Umesh

How to get Domain And port information

$
0
0

Hi All,      I have one RFC connection in ERP system (SM59) and I have one FIORI app in gateway system. Now i need to provide navigation from app which is loaded in ERP to Fiori loaded in Gateway.      To do this i need Domain and port number of Gatway system.  IS there anyway to get this information in ERP ? Regards, Praveen

Viewing all 2823 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>