2 * Copyright 2016-2017, CMCC Technologies Co., Ltd.
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
16 var serverPageTable = {};
\r
17 var queryCacheId = null;
\r
19 /* Bootstrap style full number pagination control */
\r
20 $.fn.dataTableExt.oApi.fnPagingInfo = function (oSettings) {
\r
22 "iEnd": oSettings.fnDisplayEnd(),
\r
23 "iLength": oSettings._iDisplayLength,
\r
24 "iTotal": oSettings.fnRecordsTotal(),
\r
25 "iFilteredTotal": oSettings.fnRecordsDisplay(),
\r
26 "iPage": Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength),
\r
27 "iTotalPages": Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength)
\r
31 $.extend($.fn.dataTableExt.oPagination, {
\r
32 "bootstrap_extended": {
\r
33 "fnInit": function (oSettings, nPaging, fnDraw) {
\r
34 var oLang = oSettings.oLanguage.oPaginate;
\r
35 var oPaging = oSettings.oInstance.fnPagingInfo();
\r
37 var fnClickHandler = function (e) {
\r
39 if (oSettings.oApi._fnPageChange(oSettings, e.data.action)) {
\r
45 '<div class="pagination-panel"> ' + oLang.sPage + ' ' +
\r
46 '<a href="#" class="btn btn-sm default prev disabled" title="' + oLang.sPrevious + '"><i class="fa fa-angle-left"></i></a>' +
\r
47 '<input type="text" class="pagination-panel-input input-mini input-inline input-sm" maxlenght="5" style="text-align:center; margin: 0 4px; border: 1px solid rgb(169, 169, 169);height: 28px;">' +
\r
48 '<a href="#" class="btn btn-sm default next disabled" title="' + oLang.sNext + '"><i class="fa fa-angle-right"></i></a> ' +
\r
49 oLang.sPageOf + ' <span class="pagination-panel-total"></span>' +
\r
53 var els = $('a', nPaging);
\r
55 $(els[0]).bind('click.DT', {action: "previous"}, fnClickHandler);
\r
56 $(els[1]).bind('click.DT', {action: "next"}, fnClickHandler);
\r
58 $('.pagination-panel-input', nPaging).bind('change.DT', function (e) {
\r
59 var oPaging = oSettings.oInstance.fnPagingInfo();
\r
61 var page = parseInt($(this).val());
\r
62 if (page > 0 && page < oPaging.iTotalPages) {
\r
63 if (oSettings.oApi._fnPageChange(oSettings, page - 1)) {
\r
67 $(this).val(oPaging.iPage + 1);
\r
71 $('.pagination-panel-input', nPaging).bind('keypress.DT', function (e) {
\r
72 var oPaging = oSettings.oInstance.fnPagingInfo();
\r
73 if (e.which == 13) {
\r
74 var page = parseInt($(this).val());
\r
75 if (page > 0 && page < oSettings.oInstance.fnPagingInfo().iTotalPages) {
\r
76 if (oSettings.oApi._fnPageChange(oSettings, page - 1)) {
\r
80 $(this).val(oPaging.iPage + 1);
\r
87 "fnUpdate": function (oSettings, fnDraw) {
\r
88 var iListLength = 5;
\r
89 var oPaging = oSettings.oInstance.fnPagingInfo();
\r
90 var an = oSettings.aanFeatures.p;
\r
91 var i, j, sClass, iStart, iEnd, iHalf = Math.floor(iListLength / 2);
\r
93 if (oPaging.iTotalPages < iListLength) {
\r
95 iEnd = oPaging.iTotalPages;
\r
97 else if (oPaging.iPage <= iHalf) {
\r
100 } else if (oPaging.iPage >= (oPaging.iTotalPages - iHalf)) {
\r
101 iStart = oPaging.iTotalPages - iListLength + 1;
\r
102 iEnd = oPaging.iTotalPages;
\r
104 iStart = oPaging.iPage - iHalf + 1;
\r
105 iEnd = iStart + iListLength - 1;
\r
109 for (i = 0, iLen = an.length; i < iLen; i++) {
\r
110 var wrapper = $(an[i]).parents(".dataTables_wrapper");
\r
112 if (oPaging.iTotalPages <= 0) {
\r
113 $('.pagination-panel, .dataTables_length', wrapper).hide();
\r
115 $('.pagination-panel, .dataTables_length', wrapper).show();
\r
118 $('.pagination-panel-total', an[i]).html(oPaging.iTotalPages);
\r
119 $('.pagination-panel-input', an[i]).val(oPaging.iPage + 1);
\r
121 // Remove the middle elements
\r
122 $('li:gt(1)', an[i]).filter(':not(.next)').remove();
\r
124 // Add the new list items and their event handlers
\r
125 for (j = iStart; j <= iEnd; j++) {
\r
126 sClass = (j == oPaging.iPage + 1) ? 'class="active"' : '';
\r
127 $('<li ' + sClass + '><a href="#">' + j + '</a></li>')
\r
128 .insertBefore($('li.next:first', an[i])[0])
\r
129 .bind('click', function (e) {
\r
130 e.preventDefault();
\r
131 oSettings._iDisplayStart = (parseInt($('a', this).text(), 10) - 1) * oPaging.iLength;
\r
136 // Add / remove disabled classes from the static elements
\r
137 if (oPaging.iPage === 0) {
\r
138 $('a.prev', an[i]).addClass('disabled');
\r
140 $('a.prev', an[i]).removeClass('disabled');
\r
143 if (oPaging.iPage === oPaging.iTotalPages - 1 || oPaging.iTotalPages === 0) {
\r
144 $('a.next', an[i]).addClass('disabled');
\r
146 $('a.next', an[i]).removeClass('disabled');
\r
154 serverPageTable.getRestPara = function (cond, tableSetting) {
\r
156 var conditions = {};
\r
158 if (cond.severity != null && cond.severity != "undefined" && cond.severity.length > 0) {
\r
159 var severity = '['+cond.severity+']';
\r
160 var severityObj = window.JSON.parse(severity);
\r
161 conditions.severities=severityObj;
\r
165 if (cond.ackState != null && cond.ackState != "undefined" && cond.ackState.length > 0) {
\r
166 var ackState = '[' + cond.ackState + ']';
\r
167 var ackStateObj = window.JSON.parse(ackState)
\r
168 conditions.ackStates=ackStateObj;
\r
172 if (cond.filterState != null && cond.filterState != "undefined" && cond.filterState.length > 0) {
\r
173 var filterState = '[' + cond.filterState + ']';
\r
174 var filterStateObj = window.JSON.parse(filterState);
\r
175 conditions.isVisibles=filterStateObj;
\r
179 if (cond.ackTimeMode != null && cond.ackTimeMode != "undefined") {
\r
181 if(cond.ackTimeMode === 1){
\r
182 ackTime = '{"timeMode": '+cond.ackTimeMode+',"relativeTime": '+cond.ackRelativeTime+'}';
\r
184 ackTime = '{"beginTime": '+cond.ackTimeStarTime+',"endTime": '+cond.ackTimeEndTime+',"timeMode": '+cond.ackTimeMode+'}';
\r
186 var ackTimeObj = window.JSON.parse(ackTime);
\r
187 conditions.ackTime = ackTimeObj;
\r
191 if (cond.alarmRaisedTimeMode != null && cond.alarmRaisedTimeMode != "undefined") {
\r
192 var alarmRaisedTime;
\r
193 if(cond.alarmRaisedTimeMode === 1){
\r
194 alarmRaisedTime = '{"timeMode": '+cond.alarmRaisedTimeMode+',"relativeTime": '+cond.alarmRaisedRelativeTime+'}';
\r
196 alarmRaisedTime = '{"beginTime": '+cond.alarmRaisedStartTime+',"endTime": '+cond.alarmRaisedEndTime+',"timeMode": '+cond.alarmRaisedTimeMode+'}';
\r
198 var alarmRaisedTimeObj = window.JSON.parse(alarmRaisedTime);
\r
199 conditions.alarmRaisedTime = alarmRaisedTimeObj;
\r
203 if (cond.clearedTimeMode != null && cond.clearedTimeMode != "undefined") {
\r
205 if(cond.clearedTimeMode === 1){
\r
206 clearedTime = '{"timeMode": '+cond.clearedTimeMode+',"relativeTime": '+cond.clearedTimeRelativeTime+'}';
\r
208 clearedTime = '{"beginTime": '+cond.clearedTimeStartTime+',"endTime": '+cond.clearedTimeEndTime+',"timeMode": '+cond.clearedTimeMode+'}';
\r
210 var clearedTimeTimeObj = window.JSON.parse(clearedTime);
\r
211 conditions.alarmClearedTime = clearedTimeTimeObj;
\r
215 if (cond.probableCause != null && cond.probableCause != "undefined") {
\r
216 //var probableCauseArr = cond.probableCause.split(',');
\r
219 for (var i = 0; i < cond.probableCause.length; i++) {
\r
221 if(cond.probableCause[i].type === "1"){
\r
222 arr+='{"systemType":'+cond.probableCause[i].codeid+',"codes":[]}';
\r
224 arr+='{"systemType":'+cond.probableCause[i].parentid+',"codes":['+cond.probableCause[i].codeid+']}';
\r
227 if(cond.probableCause[i].type === "1"){
\r
228 arr+=',{"systemType":'+cond.probableCause[i].codeid+',"codes":[]}';
\r
230 arr+=',{"systemType":'+cond.probableCause[i].parentid+',"codes":['+cond.probableCause[i].codeid+']}';
\r
235 var probableCausesObj = window.JSON.parse(arr);
\r
236 conditions.probableCauses = probableCausesObj;
\r
240 requests.condition=conditions;
\r
241 requests.pageSize=tableSetting._iDisplayLength;
\r
242 requests.pageNumber=tableSetting._iDisplayStart / tableSetting._iDisplayLength + 1;
\r
243 if(cond.alarmType===2 && requests.pageNumber === 1){
\r
244 requests.queryCacheId="";
\r
245 }else if(cond.alarmType===2 && requests.pageNumber != 1){
\r
246 requests.queryCacheId=queryCacheId;
\r
249 var resStr = window.JSON.stringify(requests);
\r
257 serverPageTable.initDataTable = function (setting, cond, divId) {
\r
259 var column = setting.columns;
\r
262 $('#' + divId).children().remove();
\r
263 var tableId = setting.tableId;
\r
264 var tableEleStr = '<table class="table table-striped table-bordered table-hover" id= ' + tableId + '>'
\r
266 + '<tr role="row" class="heading" >'
\r
272 $('#' + divId).append(tableEleStr);
\r
273 //$('#'+ tableId).append(' <thead><tr role="row" class="heading" ></tr></thead><tbody></tbody>');
\r
274 var trEle = $('#' + tableId + ' > thead >tr');
\r
275 //var dataTableColumn = [];
\r
276 for (var one in column) {
\r
277 if (one != "contains") {
\r
278 var th = '<th>' + column[one].name + '</th>';
\r
283 var table = $("#" + tableId).dataTable({
\r
284 //"sDom" : "tr<'row'<'col-md-6 col-sm-12'><'col-md-6 col-sm-12'pli>>", // datatable layout
\r
285 // "sDom" : "<'row'<'col-md-12 col-sm-12'lip>r><'table-scrollable't>>",
\r
286 "oLanguage": setting.language,//汉化
\r
288 "bPaginate": true,// 分页按钮
\r
289 "bFilter": false,// 搜索栏
\r
290 "bAutoWidth": true,//自动设置列宽
\r
291 "bLengthChange": true,// 每行显示记录数
\r
292 "iDisplayLength": 10,// 每页显示行数
\r
293 "bSort": false,// 排序
\r
294 "bInfo": true,// Showing 1 to 10 of 23 entries 总记录数没也显示多少等信息
\r
296 "bScrollCollapse": false,
\r
297 "sScrollY": "400px",
\r
298 "sScrollX": "100%",
\r
299 "sPaginationType": "bootstrap_extended", // 分页, bootstrap_extended 一共两种样式 另一种为two_button // 是datatables默认
\r
300 "bProcessing": true,
\r
301 "bServerSide": true,
\r
303 "bSortCellsTop": true,
\r
304 "sDom": '<"top"rt><"bottom"lip>',
\r
305 "sAjaxSource": setting.restUrl,// ./js/testJson.json setting.restUrl
\r
306 "aoColumns": setting.columns,
\r
308 "fnServerData": function (sSource, aoData, fnCallback, oSettings) {
\r
309 oSettings.jqXHR = $.ajax({
\r
312 "dataType": "json",
\r
313 "data": serverPageTable.getRestPara(cond, oSettings),
\r
314 "success": function (resp) {
\r
315 oSettings.iDraw = oSettings.iDraw + 1;
\r
318 if(cond.ruleType===1){
\r
319 var logList = resp.alarms;
\r
320 data.iTotalRecords = resp.totalCount;
\r
321 data.iTotalDisplayRecords = resp.totalCount;
\r
323 }else if(cond.ruleType===2){
\r
324 var logList = resp.alarms;
\r
325 if(resp.queryCacheId === ""){
\r
326 data.iTotalRecords = alarmCount;
\r
327 data.iTotalDisplayRecords = alarmCount;
\r
329 alarmCount = resp.totalCount;
\r
330 data.iTotalRecords = resp.totalCount;
\r
331 data.iTotalDisplayRecords = resp.totalCount;
\r
332 queryCacheId = resp.queryCacheId;
\r
337 var pageInfo = null;
\r
339 if (pageInfo != null) {
\r
340 vm.logInfo[vm.logType].pageInfo = pageInfo;
\r
344 for(var i=0;i<logList.length;i++){
\r
345 logList[i].order="<a>"+(i+1)+"</a>";
\r
348 for(var i=0;i<logList.length;i++){
\r
349 logList[i].probableCauseCodeNameAndCode=logList[i].probableCauseCodeName+"("+logList[i].probableCauseCode+")";
\r
352 data.aaData = logList;
\r
353 data.sEcho = oSettings;
\r
356 $('#dataTableCheckBox').click(function () {
\r
357 var checkArr = $('#' + divId + ' .details-check input[type="checkbox"]');//
\r
358 for (var i = 0; i < checkArr.length; i++) {
\r
359 if ($(checkArr).eq(i).attr('id') != 'dataTableCheckBox') {
\r
360 if ($('#dataTableCheckBox').prop("checked")) {
\r
361 $(checkArr).eq(i).removeClass('checked');
\r
362 $(checkArr).eq(i).prop('checked',true);
\r
364 $(checkArr).eq(i).addClass('checked');
\r
365 $(checkArr).eq(i).prop('checked',false);
\r
374 "fnDrawCallback": function( oSettings ) { // run some code on table redraw
\r
376 var tableWrapper = $('div.dataTables_wrapper');
\r
378 var $tableHead = $('div.dataTables_scrollHeadInner > table.dataTable', tableWrapper);
\r
379 var tbodyHead = $('tbody', $tableHead);
\r
380 if(tbodyHead && tbodyHead.length >0){
\r
381 $(tbodyHead).remove();
\r
384 var $tableBody = $('table#' + tableId, tableWrapper);
\r
385 var trIn = $('thead > tr:nth-child(1)', $tableHead);
\r
386 var trBodyHead = $('thead > tr:nth-child(1)', $tableBody);
\r
387 var tds = $(trIn).children();
\r
388 var ths = $(trBodyHead).children();
\r
389 for(var k=0;k<tds.length;k++){
\r
390 $(ths.eq(k)).html('<div style="height: 0;overflow: hidden;">' + tds.eq(k).html() + '</div>');
\r
392 var bodyRows = $('tbody > tr', $tableBody);
\r
393 for(var i=0;i<bodyRows.length;i++){
\r
394 var rowClone = $(bodyRows.eq(i)).clone();
\r
395 var tds = $(rowClone).children();
\r
396 for(var j=0;j<tds.length;j++){
\r
397 $(tds.eq(j)).html('<div style="height: 0;overflow: hidden;">' + tds.eq(j).html() + '</div>');
\r
398 $(tds.eq(j)).height('0px');
\r
399 $(tds.eq(j)).css('padding-top','0px');
\r
400 $(tds.eq(j)).css('padding-bottom','0px');
\r
401 $(tds.eq(j)).css('border-top-width','0px');
\r
402 $(tds.eq(j)).css('border-bottom-width','0px');
\r
404 $(rowClone).height('0px');
\r
405 $tableHead.append($(rowClone).prop("outerHTML"));
\r
408 $('div.dataTables_scrollBody', tableWrapper).css('width','100%');
\r
409 //$('div.dataTables_scrollHead', tableWrapper).css('width','98.5%');
\r
410 $('div.dataTables_scrollHeadInner', tableWrapper).css('padding-right', 0);
\r
412 //$("table.dataTable > thead > tr > th:nth-child(2)", $(".dataTables_scrollHeadInner")).click();
\r
415 //$('div.dataTables_scrollBody', tableWrapper).css('height', "280px");
\r
417 /* $('div.dataTables_scrollHead', tableWrapper).css('display','inline-block');
\r
418 $("div.dataTables_scrollHead", tableWrapper).after("<div id='divRightPadding' style='overflow: hidden; background:#eee; position: relative; float:right; border: 1px solid #ddd; height:" + 42 + "px; width: 1.4%;'></div>"); */
\r
419 /* if($.browser.mozilla){
\r
420 $('div#divRightPadding', tableWrapper).css('height', '40');
\r
425 $(window).bind('resize', function () {
\r
426 //oTable.DataTable.models.oSettings.bAjaxDataGet = false;
\r
427 table.fnAdjustColumnSizing(setting);
\r
430 function format_Detail(oTable, nTr) {
\r
431 var aData = oTable.fnGetData(nTr);
\r
433 var sOut = '<table class = "detailTable" width="100%">';
\r
434 sOut += '<tr><td class = "detailTitleStyle" width = 160><span class = "label label-primary">' + column[3].name + '</span></td><td class = "detailCellStyle" width = 320>' + null2space(aData[column[3].mData]) + '</td>';
\r
435 sOut += '<td class = "detailTitleStyle" width = 160><span class = "label label-primary">' + column[8].name + '</span></td><td class = "detailCellStyle" width = 320>' + null2space(vm.alTypes[aData[column[8].mData]]) + '</td></tr>';
\r
437 sOut += '<tr><td class = "detailTitleStyle" width = 80><span class = "label label-primary">' + column[9].name + '</span></td><td class = "detailCellStyle" width = 160>' + null2space(aData[column[9].mData]) + '</td>';
\r
438 sOut += '<td class = "detailTitleStyle" width = 80><span class = "label label-primary">' + column[7].name + '</span></td><td class = "detailCellStyle" width = 160>' + null2space(aData[column[7].mData]) + '</td></tr>';
\r
440 sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[6].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[6].mData]) + '</td>';
\r
441 sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[11].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[11].mData]) + '</td></tr>';
\r
443 sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[10].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[10].mData]) + '</td>';
\r
444 sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[13].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[13].mData]) + '</td></tr>';
\r
446 sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[12].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[12].mData]) + '</td>';
\r
447 sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[5].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[5].mData]) + '</td></tr>';
\r
449 sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[23].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[23].mData]) + '</td>';
\r
450 sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[4].name + '</span></td><td class = "detailCellStyle">' + null2space(aData[column[4].mData]) + '</td></tr>';
\r
451 // sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[5].name + '</span></td><td class = "detailCellStyle">' + aData[column[5].mData] + '</td></tr>';
\r
453 // sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[4].name + '</span></td><td class = "detailCellStyle">' + aData[column[4].mData] + '</td>';
\r
454 // sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[22].name + '</span></td><td class = "detailCellStyle">' + aData[column[22].mData] + '</td></tr>';
\r
455 // sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[22].name + '</span></td><td class = "detailCellStyle">' + aData[column[22].mData] + '</td></tr>';
\r
457 // sOut += '<tr><td class = "detailTitleStyle"><span class = "label label-primary">' + column[12].name + '</span></td><td class = "detailCellStyle">' + aData[column[12].mData] + '</td>';
\r
458 // sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[17].name + '</span></td><td class = "detailCellStyle">' + aData[column[17].mData] + '</td></tr>';
\r
460 sOut += '<td class = "detailTitleStyle"><span class = "label label-primary">' + column[16].name + '</span></td><td class = "detailCellStyle" colspan = 3>' + null2space(aData.additionalText) + '</td></tr>';
\r
464 function null2space(nullStr){
\r
465 if(nullStr == null){
\r
471 $('#' + tableId + '>tbody').on('click', 'td.details-control', function () {
\r
472 var tr = $(this).closest('tr');
\r
473 //var nTr = $(this).parents('tr')[0];
\r
474 //var row = table.row( tr );
\r
475 if (table.fnIsOpen(tr[0])) {
\r
476 table.fnClose(tr[0]);
\r
477 //if ( row.child.isShown() ) {
\r
478 // This row is already open - close it
\r
479 //row.child.hide();
\r
480 tr.removeClass('shown');
\r
484 table.fnOpen(tr[0], format_Detail(table, tr[0]), 'details');
\r
485 //row.child( format_Detail(row.data()) ).show();
\r
486 tr.addClass('shown');
\r
490 // mod by chenhao 2015-10-26 注释掉
\r
491 // // 所有td注册一个点击事件用来展示出详情。
\r
492 // $('#ict_alarms_table >tbody').on('click', 'td', function () {
\r
494 // var className= $(this).eq(0).attr('class');
\r
495 // //当点击的是如下的table页的时候
\r
496 // if(className &&(className.indexOf('relInfo')>-1 || className.indexOf('details-check')>-1 || className.indexOf('ackState')>-1 || className.indexOf('details-control')>-1)){
\r
497 // $('#right-menu').fadeOut();
\r
500 // var tbody=$('#ict_table_general >tbody');
\r
501 // tbody.children().remove();
\r
503 // var tr = $(this).closest('tr');
\r
504 // var aData = table.fnGetData(tr[0]);
\r
505 // for (var i = 0; i < column.length; i++) {
\r
506 // if( column[i].bVisible == false ){//如果列可见就继续遍历下一个
\r
507 // trHtml += '<tr role="row"><td>'+column[i].name+':</td><td>' + aData[column[i].mData] + '</td></tr>';
\r
510 // tbody.append(trHtml);
\r
511 // if(!vm.alarmId ||vm.alarmId==aData.alarmId){
\r
512 // $('#right-menu').fadeToggle();
\r
514 // $('#right-menu').fadeIn();
\r
516 // vm.alarmId=aData.alarmId;
\r
519 //重新调节列宽以适应window resize
\r
520 $(window).bind('resize', function () {
\r
521 //oTable.fnAdjustColumnSizing();
\r
522 $("table.dataTable > thead > tr > th:nth-child(2)", $(".dataTables_scrollHeadInner")).click();
\r