|
Packit |
b099d7 |
/* $XConsortium: autopopups.c /main/5 1995/07/15 20:45:56 drk $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
#include <stdlib.h>
|
|
Packit |
b099d7 |
#include <X11/Xlib.h>
|
|
Packit |
b099d7 |
#include <X11/IntrinsicP.h>
|
|
Packit |
b099d7 |
#include <X11/CompositeP.h>
|
|
Packit |
b099d7 |
#include <Xm/XmP.h>
|
|
Packit |
b099d7 |
#include <Xm/Frame.h>
|
|
Packit |
b099d7 |
#include <Xm/Label.h>
|
|
Packit |
b099d7 |
#include <Xm/PushB.h>
|
|
Packit |
b099d7 |
#include <Xm/PushBG.h>
|
|
Packit |
b099d7 |
#include <Xm/LabelG.h>
|
|
Packit |
b099d7 |
#include <Xm/SeparatoG.h>
|
|
Packit |
b099d7 |
#include <Xm/RowColumn.h>
|
|
Packit |
b099d7 |
#include <Xm/BulletinB.h>
|
|
Packit |
b099d7 |
#include <Xm/DrawingA.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtAppContext context;
|
|
Packit |
b099d7 |
#define APP_CLASS "AutomaticPopups"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget exitpb;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void QuitAppl(Widget, char *, XmPushButtonCallbackStruct *);
|
|
Packit |
b099d7 |
void ExposeCB(Widget, char *, XmDrawingAreaCallbackStruct *);
|
|
Packit |
b099d7 |
void ButtonEventHandler(Widget, XtPointer, XEvent*);
|
|
Packit |
b099d7 |
void PopupHandlerCB(Widget, XtPointer, XmPopupHandlerCallbackStruct *);
|
|
Packit |
b099d7 |
void addButton(Widget, char*);
|
|
Packit |
b099d7 |
void addChildren(Widget, char*);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int circlex, circley, circled;
|
|
Packit |
b099d7 |
int rectx, recty, recth, rectw;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget popup1, popup2, popup3, popup4, popup5;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int main(int argc, char **argv)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget shell;
|
|
Packit |
b099d7 |
Widget frame1, frame2;
|
|
Packit |
b099d7 |
Widget da1, da2;
|
|
Packit |
b099d7 |
Widget btn1, btn2, label1, label2, btn3, sbtn1;
|
|
Packit |
b099d7 |
Widget explain;
|
|
Packit |
b099d7 |
Arg args[10];
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
XmString str, tmp1, tmp2;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
shell = XtVaAppInitialize(&context, APP_CLASS, NULL, 0, &argc, argv,
|
|
Packit |
b099d7 |
NULL, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
frame1 = XmCreateFrame(shell, "outerframe", NULL, 0);
|
|
Packit |
b099d7 |
XtManageChild(frame1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC_RECURSIVE); count++;
|
|
Packit |
b099d7 |
popup1 = XmCreatePopupMenu(frame1, "popupOF", args, count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
addChildren(popup1, "OuterFrameMenu");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized("OuterFrame");
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNframeChildType, XmFRAME_TITLE_CHILD); count++;
|
|
Packit |
b099d7 |
label1 = XmCreateLabel(frame1, "label1", args, count);
|
|
Packit |
b099d7 |
XtManageChild(label1);
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNheight, 500); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNwidth, 500); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNframeChildType, XmFRAME_WORKAREA_CHILD); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNresizePolicy, XmRESIZE_NONE); count++;
|
|
Packit |
b099d7 |
da1 = XmCreateDrawingArea(frame1, "da1", args, count);
|
|
Packit |
b099d7 |
XtManageChild(da1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNx, 100); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNy, 100); count++;
|
|
Packit |
b099d7 |
frame2 = XmCreateFrame(da1, "innerframe", args, count);
|
|
Packit |
b099d7 |
XtManageChild(frame2);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC_RECURSIVE); count++;
|
|
Packit |
b099d7 |
popup2 = XmCreatePopupMenu(frame2, "popupIF", args, count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
addChildren(popup2, "InnerFrameMenu");
|
|
Packit |
b099d7 |
addButton(popup2, "Make me different");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized("InnerFrame");
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNframeChildType, XmFRAME_TITLE_CHILD); count++;
|
|
Packit |
b099d7 |
label2 = XmCreateLabel(frame2, "label2", args, count);
|
|
Packit |
b099d7 |
XtManageChild(label2);
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNheight, 300); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNwidth, 300); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNframeChildType, XmFRAME_WORKAREA_CHILD); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNresizePolicy, XmRESIZE_NONE); count++;
|
|
Packit |
b099d7 |
da2 = XmCreateDrawingArea(frame2, "da2", args, count);
|
|
Packit |
b099d7 |
XtManageChild(da2);
|
|
Packit |
b099d7 |
XtAddCallback(da2, XmNexposeCallback, (XtCallbackProc) ExposeCB, NULL);
|
|
Packit |
b099d7 |
XtAddCallback(da2, XmNpopupHandlerCallback,
|
|
Packit |
b099d7 |
(XtCallbackProc) PopupHandlerCB, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized(
|
|
Packit |
b099d7 |
"Click Button3 anywhere to cause a popup menu");
|
|
Packit |
b099d7 |
tmp1 = XmStringConcat(str, XmStringSeparatorCreate());
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
tmp2 = XmStringCreateLocalized(
|
|
Packit |
b099d7 |
"to be posted. Note that the posted menu");
|
|
Packit |
b099d7 |
str = XmStringConcat(tmp1, tmp2);
|
|
Packit |
b099d7 |
XmStringFree(tmp1);
|
|
Packit |
b099d7 |
XmStringFree(tmp2);
|
|
Packit |
b099d7 |
tmp1 = XmStringConcat(str, XmStringSeparatorCreate());
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
tmp2 = XmStringCreateLocalized(
|
|
Packit |
b099d7 |
"differs depending on where you click.");
|
|
Packit |
b099d7 |
str = XmStringConcat(tmp1, tmp2);
|
|
Packit |
b099d7 |
XmStringFree(tmp1);
|
|
Packit |
b099d7 |
XmStringFree(tmp2);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNx, 10); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNy, 200); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNalignment, XmALIGNMENT_BEGINNING); count++;
|
|
Packit |
b099d7 |
explain = XmCreateLabelGadget(da2, "Explain", args, count);
|
|
Packit |
b099d7 |
XtManageChild(explain);
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
circlex = 40; circley = 120; circled = 30;
|
|
Packit |
b099d7 |
rectx = 80; recty = 120; recth = 30; rectw = 60;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized("Quit");
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNx, 40); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNy, 40); count++;
|
|
Packit |
b099d7 |
btn1 = XmCreatePushButton(da2, "pb1", args, count);
|
|
Packit |
b099d7 |
XtManageChild(btn1);
|
|
Packit |
b099d7 |
XtAddCallback(btn1, XmNactivateCallback,
|
|
Packit |
b099d7 |
(XtCallbackProc) QuitAppl, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized("Another Button With no Menu");
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNx, 40); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNy, 80); count++;
|
|
Packit |
b099d7 |
btn3 = XmCreatePushButton(da2, "pb3", args, count);
|
|
Packit |
b099d7 |
XtManageChild(btn3);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC); count++;
|
|
Packit |
b099d7 |
popup4 = XmCreatePopupMenu(btn1, "popupBtn1", args, count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
addChildren(popup4, "SharedMenu");
|
|
Packit |
b099d7 |
addButton(popup4, "Do something more");
|
|
Packit |
b099d7 |
addButton(popup4, "What else?");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized("PushMe");
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNx, 40); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNy, 40); count++;
|
|
Packit |
b099d7 |
btn2 = XmCreatePushButton(da1, "pb2", args, count);
|
|
Packit |
b099d7 |
XtManageChild(btn2);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized("I share a menu");
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNlabelString, str); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNx, 240); count++;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNy, 40); count++;
|
|
Packit |
b099d7 |
sbtn1 = XmCreatePushButton(da1, "sharepb1", args, count);
|
|
Packit |
b099d7 |
XtManageChild(sbtn1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Associate a menu with this button */
|
|
Packit |
b099d7 |
XmAddToPostFromList(popup4, sbtn1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC); count++;
|
|
Packit |
b099d7 |
popup3 = XmCreatePopupMenu(btn2, "popupBtn2", args, count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
addChildren(popup3, "Button2Menu");
|
|
Packit |
b099d7 |
addButton(popup3, "Do something more");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNpopupEnabled, True); count++;
|
|
Packit |
b099d7 |
popup4 = XmCreatePopupMenu(da2, "PopupObjects1", args, count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
addChildren(popup4, "ObjectMenu");
|
|
Packit |
b099d7 |
addButton(popup4, "Flip");
|
|
Packit |
b099d7 |
addButton(popup4, "Size");
|
|
Packit |
b099d7 |
addButton(popup4, "Stretch");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtRealizeWidget(shell);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtAppMainLoop(context);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return 0; /* make compiler happy */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
QuitAppl(Widget w, char *i, XmPushButtonCallbackStruct *e)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
exit(0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
addChildren(Widget popup, char* label)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmString str;
|
|
Packit |
b099d7 |
Arg args[2];
|
|
Packit |
b099d7 |
Widget child;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized(label);
|
|
Packit |
b099d7 |
XtSetArg(args[0], XmNlabelString, str);
|
|
Packit |
b099d7 |
child = XmCreateLabelGadget(popup, "Title", args, 1);
|
|
Packit |
b099d7 |
XtManageChild(child);
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
child = XmCreateSeparatorGadget(popup, "Sep", NULL, 0);
|
|
Packit |
b099d7 |
XtManageChild(child);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
addButton(popup, "Cut");
|
|
Packit |
b099d7 |
addButton(popup, "Copy");
|
|
Packit |
b099d7 |
addButton(popup, "Paste");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
addButton(Widget parent, char* label)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget ch;
|
|
Packit |
b099d7 |
XmString str;
|
|
Packit |
b099d7 |
Arg args[2];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
str = XmStringCreateLocalized(label);
|
|
Packit |
b099d7 |
XtSetArg(args[0], XmNlabelString, str);
|
|
Packit |
b099d7 |
ch = XmCreatePushButtonGadget(parent, label, args, 1);
|
|
Packit |
b099d7 |
XtManageChild(ch);
|
|
Packit |
b099d7 |
XmStringFree(str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GC drawGC = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
ExposeCB(Widget da, char *ig, XmDrawingAreaCallbackStruct *cbs)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Arg args[2];
|
|
Packit |
b099d7 |
XGCValues gcv;
|
|
Packit |
b099d7 |
Pixel fg;
|
|
Packit |
b099d7 |
Pixel bg;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (drawGC == NULL) {
|
|
Packit |
b099d7 |
XtSetArg (args[0], XmNforeground, &fg;;
|
|
Packit |
b099d7 |
XtSetArg (args[1], XmNbackground, &bg;;
|
|
Packit |
b099d7 |
XtGetValues (da, args, 2);
|
|
Packit |
b099d7 |
gcv.foreground = fg;
|
|
Packit |
b099d7 |
gcv.background = bg;
|
|
Packit |
b099d7 |
gcv.line_width = 2;
|
|
Packit |
b099d7 |
drawGC = XtGetGC (da, GCForeground | GCBackground | GCLineWidth, &gcv;;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XDrawArc(XtDisplay(da), XtWindow(da), drawGC,
|
|
Packit |
b099d7 |
circlex, circley, circled, circled,
|
|
Packit |
b099d7 |
0, (360 * 64));
|
|
Packit |
b099d7 |
XDrawRectangle(XtDisplay(da), XtWindow(da), drawGC,
|
|
Packit |
b099d7 |
rectx, recty, rectw, recth);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
PopupHandlerCB(Widget da, XtPointer ignore, XmPopupHandlerCallbackStruct *phcs)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int radius;
|
|
Packit |
b099d7 |
int dx, dy;
|
|
Packit |
b099d7 |
XButtonEvent *bevent = (XButtonEvent *) phcs -> event;
|
|
Packit |
b099d7 |
int eventx, eventy;
|
|
Packit |
b099d7 |
Position wox, woy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Translate event coordinates to this widget */
|
|
Packit |
b099d7 |
/* First get origin of this widget */
|
|
Packit |
b099d7 |
XtTranslateCoords(da, 0, 0, &wox, &woy;;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Now calculate relative offset */
|
|
Packit |
b099d7 |
eventx = bevent -> x_root - wox;
|
|
Packit |
b099d7 |
eventy = bevent -> y_root - woy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check for hit in circle or rectangle to post special
|
|
Packit |
b099d7 |
menus */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
dx = eventx - rectx;
|
|
Packit |
b099d7 |
dy = eventy - recty;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (dx > 0 && dx < rectw &&
|
|
Packit |
b099d7 |
dy > 0 && dy < recth) {
|
|
Packit |
b099d7 |
phcs -> menuToPost = popup4;
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
dx = eventx - circlex;
|
|
Packit |
b099d7 |
dy = eventy - circley;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
dx -= circled / 2;
|
|
Packit |
b099d7 |
dy -= circled / 2;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
radius = (dx * dx) + (dy * dy);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (radius < ((circled * circled) / 4))
|
|
Packit |
b099d7 |
phcs -> menuToPost = popup4;
|
|
Packit |
b099d7 |
}
|