public void run(PerSecurityWSDL.PerSecurityWS ps) { try{ String responseId = "dummy-response-id"; GetPortfolioValidationRequest req = new GetPortfolioValidationRequest(); req.responseId = responseId; Console.WriteLine("Sending submit portfolio validation request"); GetPortfolioValidationResponse resp = ps.getPortfolioValidation(req); int count = 0; // Keep polling for response till the data is available do { Console.WriteLine("This is a dummy response id. The data is not available"); System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); resp = ps.getPortfolioValidation(req); count++; } while (resp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE && count < 5); // Display data if (resp.statusCode.code == PerSecurity.SUCCESS) { Console.WriteLine("Retrieve get quotes request successful. Response ID:" + resp.responseId); for (int i = 0; i < resp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + resp.instrumentDatas[i].instrument.id + " " + resp.instrumentDatas[i].instrument.yellowkey); Console.WriteLine("validation code = " + resp.instrumentDatas[i].code.ToString() + ", bb unique = " + resp.instrumentDatas[i].bbUnique); } } else if (resp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in submitted request"); } catch (Exception e) { Console.WriteLine(e.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { //Setting request header information GetCompanyHeaders gtCompHdrs = new GetCompanyHeaders(); gtCompHdrs.creditrisk = true; //Setting instruments Instrument ticker = new Instrument(); ticker.id = "AAPL US"; ticker.yellowkey = MarketSector.Equity; ticker.yellowkeySpecified = true; //Setting the get Company request parameter SubmitGetCompanyRequest sbmtGtCompReq = new SubmitGetCompanyRequest(); sbmtGtCompReq.headers = gtCompHdrs; Instruments instrs = new Instruments(); instrs.instrument = new Instrument[] { ticker }; sbmtGtCompReq.instruments = instrs; //Setting fields for the request sbmtGtCompReq.fields = new string[] { "ID_BB_COMPANY", "ID_BB_ULTIMATE_PARENT_CO_NAME" }; try { Console.WriteLine("Submit Get Company Request"); SubmitGetCompanyResponse sbmtGtCompResp = ps.submitGetCompanyRequest(sbmtGtCompReq); System.Console.WriteLine("status " + sbmtGtCompResp.statusCode.description); System.Console.WriteLine("Submit Get Company request - response ID = " + sbmtGtCompResp.responseId); //retrieve get company request. The response ID sent for the request is the response ID //received from SubmitGetCompanyRequest() Console.WriteLine("Retrieve Company request"); RetrieveGetCompanyRequest rtvGrCompReq = new RetrieveGetCompanyRequest(); rtvGrCompReq.responseId = sbmtGtCompResp.responseId; RetrieveGetCompanyResponse rtrvGtCompResp = new RetrieveGetCompanyResponse(); //Keep sending the request if status is 100 do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rtrvGtCompResp = ps.retrieveGetCompanyResponse(rtvGrCompReq); } while (rtrvGtCompResp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); if (rtrvGtCompResp.statusCode.code == PerSecurity.SUCCESS) { //Displaying the rtrvGtCompResp for (int i = 0; i < rtrvGtCompResp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + rtrvGtCompResp.instrumentDatas[i].instrument.id + " " + rtrvGtCompResp.instrumentDatas[i].instrument.yellowkey); for (int j = 0; j < rtrvGtCompResp.instrumentDatas[i].data.Length; j++) { if (rtrvGtCompResp.instrumentDatas[i].data[j].isArray == true) { //In case this is a bulk field request for (int k = 0; k < rtrvGtCompResp.instrumentDatas[i].data[j].bulkarray.Length; k++) { Console.WriteLine("-------------------------_"); for (int l = 0; l < rtrvGtCompResp.instrumentDatas[i].data[j]. bulkarray[k].data.Length; l++) Console.WriteLine(rtrvGtCompResp.instrumentDatas[i].data[j].bulkarray[k].data[l].value); } } else Console.WriteLine(" " + rtrvGtCompResp.fields[j] + " : " + rtrvGtCompResp.instrumentDatas[i].data[j].value); } } } else if (rtrvGtCompResp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in the submitted request"); } catch (Exception e) { Console.WriteLine(e.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { try { // Setting header for the request GetFundamentalsHeaders getFundHeaders = new GetFundamentalsHeaders(); GetDataHeaders getDataHeaders = new GetDataHeaders(); getDataHeaders.closingvaluesSpecified = true; getDataHeaders.closingvalues = true; getDataHeaders.secmasterSpecified = true; getDataHeaders.secmaster = true; getDataHeaders.derivedSpecified = true; getDataHeaders.derived = true; // Setting instruments for the request Instrument ticker = new Instrument(); ticker.id = "IBM US"; ticker.type = InstrumentType.TICKER; ticker.yellowkey = MarketSector.Equity; Instrument bbUniqueId = new Instrument(); bbUniqueId.id = "EQ0086119600001000"; bbUniqueId.type = InstrumentType.BB_UNIQUE; Instrument[] instr = new Instrument[] { ticker, bbUniqueId }; String[] field = new String[] { "TOP_ANALYST_PERFORM_RANK_TRR" }; // Sending submit get data request SubmitGetDataRequest sbmtGetDtReq = new SubmitGetDataRequest(); sbmtGetDtReq.headers = getDataHeaders; sbmtGetDtReq.fields = field; Instruments instrmnts = new Instruments(); instrmnts.instrument = instr; sbmtGetDtReq.instruments = instrmnts; Console.WriteLine("Sending submit get bulk data request"); SubmitGetDataResponse sbmtGetDtResp = ps .submitGetDataRequest(sbmtGetDtReq); Console.WriteLine("Submit get data request status: " + sbmtGetDtResp.statusCode.description + " response ID: " + sbmtGetDtResp.responseId); // Sending retrieve get data request RetrieveGetDataRequest rtvGetDtReq = new RetrieveGetDataRequest(); rtvGetDtReq.responseId = sbmtGetDtResp.responseId; RetrieveGetDataResponse rtvGetDtResp = new RetrieveGetDataResponse(); Console.WriteLine("Sending retrieve get data request"); // Keep polling for response till the data is available do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rtvGetDtResp = ps.retrieveGetDataResponse(rtvGetDtReq); } while (rtvGetDtResp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); // Display data if (rtvGetDtResp.statusCode.code == PerSecurity.SUCCESS) { Console.WriteLine("Retrieve get data request successful. Response ID: " + rtvGetDtResp.responseId); for (int i = 0; i < rtvGetDtResp.instrumentDatas.Length; i++) { InstrumentData data = rtvGetDtResp.instrumentDatas[i]; Console.WriteLine(data.instrument.id); Data[] datas = data.data; for (int j = 0; j < datas.Length; j++) { //Displaying bulk data if (datas[j].isArray) { for (int k = 0; k < datas[j].bulkarray.Length; k++) for (int l = 0; l < datas[j].bulkarray[k].data.Length; l++) { Console.WriteLine(datas[j].bulkarray[k].data[l].type + ": " + datas[j].bulkarray[k].data[l].value); } } //Displaying non-bulk data else Console.WriteLine(datas[j].value); } } } else if (rtvGetDtResp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in submitted request"); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { try { //Setting headers GetActionsHeaders getActionHeaders = new GetActionsHeaders(); getActionHeaders.actions_date = ActionsDate.entry; String[] actions = new String[] { "DVD_CASH", "DISTRIBUTIONS" }; getActionHeaders.actions = actions; //Setting Instruments Instruments instruments = new Instruments(); Instrument instr = new Instrument(); instr.id = "COP US"; instr.yellowkeySpecified = true; instr.typeSpecified = true; instr.yellowkey = MarketSector.Equity; instr.type = InstrumentType.TICKER; instruments.instrument = new Instrument[] { instr }; //Submitting request SubmitGetActionsRequest req = new SubmitGetActionsRequest(); req.headers = getActionHeaders; req.instruments = instruments; SubmitGetActionsResponse resp = null; resp = ps.submitGetActionsRequest(req); String responseId = resp.responseId; Console.WriteLine("Submit get actions request status: " + resp.statusCode.description + " responseId: " + responseId); //Submit retrieve request RetrieveGetActionsRequest rtrvReq = new RetrieveGetActionsRequest(); rtrvReq.responseId = responseId; Console.WriteLine("Sending retrieve get actions request"); RetrieveGetActionsResponse rtrvResp = new RetrieveGetActionsResponse(); // Keep polling for response till the data is available do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rtrvResp = ps.retrieveGetActionsResponse(rtrvReq); } while (rtrvResp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); //Display data if (rtrvResp.statusCode.code == PerSecurity.SUCCESS) { Console.WriteLine("Retrieve get quotes request successful. Response ID:" + rtrvResp.responseId); for (int i = 0; i < rtrvResp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + rtrvResp.instrumentDatas[i].instrument.id + " " + rtrvResp.instrumentDatas[i].instrument.yellowkey ); Console.WriteLine(", Company id = " + rtrvResp.instrumentDatas[i].standardFields.companyId.ToString()); Console.WriteLine(", Security id = " + rtrvResp.instrumentDatas[i].standardFields.securityId.ToString()); if (rtrvResp.instrumentDatas[i].data != null) { for (int j = 0; j < rtrvResp.instrumentDatas[i].data.Length; j++) { Console.WriteLine(": field = " + rtrvResp.instrumentDatas[i].data[j].field + ", value = " + rtrvResp.instrumentDatas[i].data[j].value); } } } } else if (rtrvResp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in submitted request"); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { try{ //Setting headers GetHistoryHeaders getHistHeaders = new GetHistoryHeaders(); getHistHeaders.display_pricing_srcSpecified = true; getHistHeaders.display_pricing_src = true; Instrument ticker = new Instrument(); ticker.id = "IBM US"; ticker.typeSpecified = true; ticker.yellowkeySpecified = true; ticker.type = InstrumentType.TICKER; ticker.yellowkey = MarketSector.Equity; Instrument[] instr = new Instrument[] { ticker }; Instruments instrs = new Instruments(); instrs.instrument = instr; String[] fields = new String[] { "PX_LAST" }; //Sending Request SubmitGetHistoryRequest sbmtGtHistReq = new SubmitGetHistoryRequest(); sbmtGtHistReq.headers = getHistHeaders; sbmtGtHistReq.instruments = instrs; sbmtGtHistReq.fields = fields; Console.WriteLine("Submit Get History request"); SubmitGetHistoryResponse sbmtGtHistResp = ps .submitGetHistoryRequest(sbmtGtHistReq); Console.WriteLine("Submit Get Data request - Status: " + sbmtGtHistResp.statusCode.description + " response ID = " + sbmtGtHistResp.responseId); Console.WriteLine("Sending retrieve data request"); RetrieveGetHistoryRequest rtrvGtHistReq = new RetrieveGetHistoryRequest(); rtrvGtHistReq.responseId=sbmtGtHistResp.responseId; RetrieveGetHistoryResponse rtrvGtHistResp = new RetrieveGetHistoryResponse(); // Keep polling for response till the data is available do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rtrvGtHistResp = ps.retrieveGetHistoryResponse(rtrvGtHistReq); } while (rtrvGtHistResp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); // Displaying data if (rtrvGtHistResp.statusCode.code == PerSecurity.SUCCESS) { Console.WriteLine("Retrieve get data request successful Response ID: " + rtrvGtHistResp.responseId); for (int i = 0; i < rtrvGtHistResp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + rtrvGtHistResp.instrumentDatas[i].instrument.id + " " + rtrvGtHistResp.instrumentDatas[i].instrument.yellowkey); Console.WriteLine("Time: " + rtrvGtHistResp.instrumentDatas[i].date.Hour.ToString() + ":" + rtrvGtHistResp.instrumentDatas[i].date.Minute.ToString() + ":" + rtrvGtHistResp.instrumentDatas[i].date.Second.ToString()); Console.WriteLine("Pricing Source: " + rtrvGtHistResp.instrumentDatas[i].pricingSource); for (int j = 0; j < rtrvGtHistResp.instrumentDatas[i].data.Length; j++) { Console.WriteLine(fields[j] + " : " + rtrvGtHistResp.instrumentDatas[i].data[j].value); } } } else if (rtrvGtHistResp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine(" Error in the submitted request" ); }catch(Exception ex) { Console.WriteLine(ex.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { try { //Setting header information QuotesHeaders headers = new QuotesHeaders(); DateTime start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 10, 0); DateTime end = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 11, 0); if (new DateTime().DayOfWeek == DayOfWeek.Saturday) { TimeSpan ts1 = new TimeSpan(1, 0, 0, 0); start= start.Subtract(ts1); end= end.Subtract(ts1); } else if (new DateTime().DayOfWeek == DayOfWeek.Sunday) { start.AddDays(-2); end.AddDays(-2); } DateTimeRange dtr = new DateTimeRange(); dtr.startDateTime = start; dtr.endDateTime = end; dtr.region = "NY"; headers.datetimerange = dtr; //Setting instruments Instrument ticker = new Instrument(); ticker.id = "IBM US"; ticker.yellowkeySpecified = true; ticker.typeSpecified = true; ticker.yellowkey = MarketSector.Equity; ticker.type = InstrumentType.TICKER; Instruments instrs = new Instruments(); instrs.instrument = new Instrument[] { ticker }; SubmitGetAllQuotesRequest req = new SubmitGetAllQuotesRequest(); req.headers = headers; req.instruments = instrs; Console.WriteLine("Sending submit get all quotes request"); SubmitGetAllQuotesResponse resp = ps.submitGetAllQuotesRequest(req); String responseId = resp.responseId; Console.WriteLine("Submit get all quotes request status: " + resp.statusCode.description + " responseId: " + resp.responseId); RetrieveGetAllQuotesRequest rreq = new RetrieveGetAllQuotesRequest(); rreq.responseId = responseId; RetrieveGetAllQuotesResponse rresp = ps.retrieveGetAllQuotesResponse(rreq); Console.WriteLine("Sending retrieve get all quotes request"); // Keep polling for response till the data is available do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rresp = ps.retrieveGetAllQuotesResponse(rreq); } while (rresp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); // Display data if (rresp.statusCode.code == PerSecurity.SUCCESS) { Console.WriteLine("Retrieve get all quotes request successful. Response ID:" + rresp.responseId); for (int i = 0; i < rresp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + rresp.instrumentDatas[i].instrument.id + " " + rresp.instrumentDatas[i].instrument.yellowkey); for (int j = 0; j < rresp.instrumentDatas[i].quotes.Length; j++) { for (int k = 0; k < rresp.instrumentDatas[i].quotes[j].matchedQuote.Length; k++) { Console.WriteLine(" type = " + rresp.instrumentDatas[i].quotes[j].matchedQuote[k].type + ", price = " + rresp.instrumentDatas[i].quotes[j].matchedQuote[k].price + ", volume = " + rresp.instrumentDatas[i].quotes[j].matchedQuote[k].volume ); } } } } else if (rresp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in submitted request"); } catch (Exception e) { Console.WriteLine(e.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { try{ // Setting headers for the request GetDataHeaders getDataHeaders = new GetDataHeaders(); getDataHeaders.closingvaluesSpecified = true; getDataHeaders.closingvalues = true; getDataHeaders.secmasterSpecified = true; getDataHeaders.secmaster = true; getDataHeaders.derivedSpecified = true; getDataHeaders.derived = true; // Setting list of instruments for data request Instrument ticker = new Instrument(); ticker = new Instrument(); ticker.id = "IBM US"; ticker.type= InstrumentType.TICKER; ticker.yellowkey = MarketSector.Equity; Instrument[] instr = new Instrument[] { ticker }; String[] field = new String[] { "ID_BB_UNIQUE", "TICKER", "PX_LAST", "PX_ASK", "PX_BID", "VWAP_DT" }; BvalFieldSet fieldset = new BvalFieldSet(); fieldset.fieldmacro = BvalFieldMacro.BVAL_BOND; // Submit get data request SubmitGetDataRequest sbmtGetDtReq = new SubmitGetDataRequest(); sbmtGetDtReq.headers = getDataHeaders; sbmtGetDtReq.fields = field; sbmtGetDtReq.fieldsets = new BvalFieldSet[] { fieldset }; Instruments instrmnts = new Instruments(); instrmnts.instrument = instr; sbmtGetDtReq.instruments = instrmnts ; Console.WriteLine("Sending submit get data request"); SubmitGetDataResponse sbmtGetDtResp = ps .submitGetDataRequest(sbmtGetDtReq); Console.WriteLine("Submit get data request status: " + sbmtGetDtResp.statusCode.description + " responseId: " + sbmtGetDtResp.responseId); // Submit retrieve data RetrieveGetDataRequest rtvGetDtReq = new RetrieveGetDataRequest(); rtvGetDtReq.responseId = sbmtGetDtResp.responseId; RetrieveGetDataResponse rtvGetDtResp = new RetrieveGetDataResponse(); Console.WriteLine("Sending retrieve get data request"); // Keep polling for response till the data is available do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rtvGetDtResp = ps.retrieveGetDataResponse(rtvGetDtReq); } while (rtvGetDtResp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); // Display data if (rtvGetDtResp.statusCode.code == PerSecurity.SUCCESS) { Console.WriteLine("Retrieve get data request successful. Response ID:" + rtvGetDtResp.responseId); for (int i = 0; i < rtvGetDtResp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + rtvGetDtResp.instrumentDatas[i].instrument.id + " " + rtvGetDtResp.instrumentDatas[i].instrument.yellowkey); for (int j = 0; j < rtvGetDtResp.instrumentDatas[i].data.Length; j++) { Console.WriteLine(" " + rtvGetDtResp.fields[j] + ": " + rtvGetDtResp.instrumentDatas[i].data[j].value); } } } else if (rtvGetDtResp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in submitted request"); } catch (Exception e) { Console.WriteLine(e.Message); } }
public void run(PerSecurityWSDL.PerSecurityWS ps) { //Setting request header information GetDataHeaders getDataHeaders = new GetDataHeaders(); getDataHeaders.secmaster = true; getDataHeaders.secmasterSpecified = true; getDataHeaders.closingvalues = true; getDataHeaders.closingvaluesSpecified = true; getDataHeaders.derived = true; getDataHeaders.derivedSpecified = true; //Setting Instrument information //Instrument bbUniqueId = new Instrument(); //bbUniqueId.id = "EQ0086119600001000"; //bbUniqueId.type = InstrumentType.BB_UNIQUE; //bbUniqueId.typeSpecified = true; //Instrument ticker = new Instrument(); //ticker.id = "IBM"; //ticker.yellowkey = MarketSector.Equity; //ticker.yellowkeySpecified = true; //ticker.type = InstrumentType.TICKER; //ticker.typeSpecified = true; Instrument bbUniqueId = new Instrument(); bbUniqueId.id = "GB0003252318"; bbUniqueId.type = InstrumentType.ISIN; bbUniqueId.typeSpecified = true; //Setting the get data request parameter SubmitGetDataRequest sbmtGtDtreq = new SubmitGetDataRequest(); sbmtGtDtreq.headers = getDataHeaders; // sbmtGtDtreq.fields = new string[] { "ID_BB_UNIQUE", "TICKER", "PX_LAST", "PX_ASK", "PX_BID", "VWAP_DT" }; sbmtGtDtreq.fields = new string[] { "ID_BB_UNIQUE", "PX_LAST"}; Instruments instrs = new Instruments(); System.Collections.Generic.List<Instrument> instrsList = new System.Collections.Generic.List<Instrument>(); // instrsList.Add(ticker); instrsList.Add(bbUniqueId); //instrs.instrument = new Instrument[] { ticker, bbUniqueId }; instrs.instrument = new Instrument[] {bbUniqueId }; sbmtGtDtreq.instruments = new Instruments(); sbmtGtDtreq.instruments = instrs; try { Console.WriteLine("Submit Get Data Request"); SubmitGetDataResponse sbmtGtDtresp = ps.submitGetDataRequest(sbmtGtDtreq); System.Console.WriteLine("status " + sbmtGtDtresp.statusCode.description); System.Console.WriteLine("Submit Get Data request - response ID = " + sbmtGtDtresp.responseId); //retrieve get data request. The response ID sent for the request is the response ID //received from SubmitGetDataRequest() Console.WriteLine("Retrieve data request"); RetrieveGetDataRequest rtrvGtDrReq = new RetrieveGetDataRequest(); rtrvGtDrReq.responseId = sbmtGtDtresp.responseId; RetrieveGetDataResponse rtrvGtDrResp = new RetrieveGetDataResponse(); //Keep sending the request if status is 100 do { System.Threading.Thread.Sleep(PerSecurity.POLL_INTERVAL); rtrvGtDrResp = ps.retrieveGetDataResponse(rtrvGtDrReq); } while (rtrvGtDrResp.statusCode.code == PerSecurity.DATA_NOT_AVAILABLE); if (rtrvGtDrResp.statusCode.code == PerSecurity.SUCCESS) { //Displaying the RetrieveGetDataResponse for (int i = 0; i < rtrvGtDrResp.instrumentDatas.Length; i++) { Console.WriteLine("Data for :" + rtrvGtDrResp.instrumentDatas[i].instrument.id + " " + rtrvGtDrResp.instrumentDatas[i].instrument.yellowkey); for (int j = 0; j < rtrvGtDrResp.instrumentDatas[i].data.Length; j++) { if (rtrvGtDrResp.instrumentDatas[i].data[j].isArray == true) { //In case this is a bulk field request for (int k = 0; k < rtrvGtDrResp.instrumentDatas[i].data[j].bulkarray.Length; k++) { Console.WriteLine("-------------------------"); for (int l = 0; l < rtrvGtDrResp.instrumentDatas[i].data[j]. bulkarray[k].data.Length; l++) Console.WriteLine(rtrvGtDrResp. instrumentDatas[i].data[j].bulkarray[k].data[l].value); } } else Console.WriteLine(" " + sbmtGtDtreq.fields[j] + " : " + rtrvGtDrResp. instrumentDatas[i].data[j].value); } } } else if (rtrvGtDrResp.statusCode.code == PerSecurity.REQUEST_ERROR) Console.WriteLine("Error in the submitted request"); } catch (Exception e) { Console.WriteLine(e.Message + " " + e.StackTrace); } }