{"thread":{"id":"17088","subject":"[EGIT PATCH 2/2] Add a border to the refs tree in the branch dialog","startedAt":"2009-01-11T16:18:55Z","lastAt":"2009-01-11T16:18:56Z","messageCount":2,"participants":["Robin Rosenberg"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"99971","messageId":"1231690736-6452-1-git-send-email-robin.rosenberg@dewire.com","threadId":"17088","inReplyTo":null,"subject":"[EGIT PATCH 1/2] Use text resources for branch dialog and add shortcuts.","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2009-01-11T16:18:55Z","receivedAt":"2009-01-11T16:18:55Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../src/org/spearce/egit/ui/UIText.java            |   72 +++++++++++++++\n .../ui/internal/dialogs/BranchSelectionDialog.java |   92 +++++++++++---------\n .../src/org/spearce/egit/ui/uitext.properties      |   25 ++++++\n 3 files changed, 148 insertions(+), 41 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\nindex 124d7a0..c9610b0 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n@@ -760,6 +760,78 @@\n \t/** */\n \tpublic static String WindowCachePreferencePage_packedGitMMAP;\n \n+\t/** */\n+\tpublic static String BranchSelectionDialog_OkReset;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ErrorCouldNotRefreshBranchList;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ErrorCouldNotCreateNewRef;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ErrorCouldNotRefresh;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_BranchSuffix_Current;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ResetType;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ResetTypeSoft;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ResetTypeMixed;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ResetTypeHard;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_Tags;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_RemoteBranches;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_LocalBranches;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_NoBranchSeletectTitle;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ReallyResetTitle;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ReallyResetMessage;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_QuestionNewBranchTitle;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_QuestionNewBranchMessage;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_NewBranch;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ErrorAlreadyExists;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ErrorCouldNotResolve;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_ErrorInvalidRefName;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_OkCheckout;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_NoBranchSeletectMessage;\n+\n+\t/** */\n+\tpublic static String BranchSelectionDialog_Refs;\n+\n \tstatic {\n \t\tinitializeMessages(UIText.class.getPackage().getName() + \".uitext\",\n \t\t\t\tUIText.class);\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java\nindex 1641840..8859b5d 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java\n@@ -24,6 +24,7 @@\n import org.eclipse.jface.layout.GridLayoutFactory;\n import org.eclipse.jface.resource.JFaceResources;\n import org.eclipse.jface.window.Window;\n+import org.eclipse.osgi.util.NLS;\n import org.eclipse.swt.SWT;\n import org.eclipse.swt.events.DisposeEvent;\n import org.eclipse.swt.events.DisposeListener;\n@@ -37,12 +38,14 @@\n import org.eclipse.swt.widgets.Composite;\n import org.eclipse.swt.widgets.Event;\n import org.eclipse.swt.widgets.Group;\n+import org.eclipse.swt.widgets.Label;\n import org.eclipse.swt.widgets.Listener;\n import org.eclipse.swt.widgets.Shell;\n import org.eclipse.swt.widgets.Tree;\n import org.eclipse.swt.widgets.TreeItem;\n import org.spearce.egit.core.op.ResetOperation.ResetType;\n import org.spearce.egit.ui.Activator;\n+import org.spearce.egit.ui.UIText;\n import org.spearce.jgit.lib.Constants;\n import org.spearce.jgit.lib.ObjectId;\n import org.spearce.jgit.lib.RefUpdate;\n@@ -56,7 +59,7 @@\n \tprivate final Repository repo;\n \n \tprivate boolean showResetType = true;\n-\t\n+\n \t/**\n \t * Construct a dialog to select a branch to reset to or check out\n \t * @param parentShell\n@@ -76,38 +79,38 @@ public void setShowResetType(boolean show) {\n \t}\n \n \tprivate Composite parent;\n-\t\n+\n \tprivate Tree branchTree;\n-\t\n+\n \t@Override\n \tprotected Composite createDialogArea(Composite base) {\n \t\tparent = (Composite) super.createDialogArea(base);\n \t\tparent.setLayout(GridLayoutFactory.swtDefaults().create());\n-\t\t\n+\t\tnew Label(parent, SWT.NONE).setText(UIText.BranchSelectionDialog_Refs);\n \t\tbranchTree = new Tree(parent, SWT.NONE);\n \t\tbranchTree.setLayoutData(GridDataFactory.fillDefaults().grab(true,true).hint(500, 300).create());\n-\t\t\n+\n \t\tif (showResetType) {\n \t\t\tbuildResetGroup();\n \t\t}\n-\t\t\n+\n \t\ttry {\n \t\t\tfillTreeWithBranches(null);\n \t\t} catch (IOException e) {\n-\t\t\tActivator.logError(\"Could not refresh list of branches\", e);\n+\t\t\tActivator.logError(UIText.BranchSelectionDialog_ErrorCouldNotRefresh, e);\n \t\t}\n-\t\t\n+\n \t\treturn parent;\n \t}\n \n \tprivate void buildResetGroup() {\n \t\tGroup g = new Group(parent, SWT.NONE);\n-\t\tg.setText(\"Reset Type\");\n+\t\tg.setText(UIText.BranchSelectionDialog_ResetType);\n \t\tg.setLayoutData(GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.CENTER).create());\n \t\tg.setLayout(new RowLayout(SWT.VERTICAL));\n \n \t\tButton soft = new Button(g, SWT.RADIO);\n-\t\tsoft.setText(\"Soft (Index and working directory unmodified)\");\n+\t\tsoft.setText(UIText.BranchSelectionDialog_ResetTypeSoft);\n \t\tsoft.addListener(SWT.Selection, new Listener() {\n \t\t\tpublic void handleEvent(Event event) {\n \t\t\t\tresetType = ResetType.SOFT;\n@@ -116,7 +119,7 @@ public void handleEvent(Event event) {\n \n \t\tButton medium = new Button(g, SWT.RADIO);\n \t\tmedium.setSelection(true);\n-\t\tmedium.setText(\"Mixed (working directory unmodified)\");\n+\t\tmedium.setText(UIText.BranchSelectionDialog_ResetTypeMixed);\n \t\tmedium.addListener(SWT.Selection, new Listener() {\n \t\t\tpublic void handleEvent(Event event) {\n \t\t\t\tresetType = ResetType.MIXED;\n@@ -124,7 +127,7 @@ public void handleEvent(Event event) {\n \t\t});\n \n \t\tButton hard = new Button(g, SWT.RADIO);\n-\t\thard.setText(\"Hard\");\n+\t\thard.setText(UIText.BranchSelectionDialog_ResetTypeHard);\n \t\thard.addListener(SWT.Selection, new Listener() {\n \t\t\tpublic void handleEvent(Event event) {\n \t\t\t\tresetType = ResetType.HARD;\n@@ -137,12 +140,12 @@ private void fillTreeWithBranches(String select) throws IOException {\n \t\tList<String> branches = new ArrayList<String>(repo.getAllRefs()\n \t\t\t\t.keySet());\n \t\tCollections.sort(branches);\n-\t\t\n+\n \t\tTreeItem curItem = null;\n \t\tTreeItem curSubItem = null;\n \t\tString curPrefix = null;\n \t\tString curSubPrefix = null;\n-\t\t\n+\n \t\tfor (String ref : branches) {\n \t\t\tString shortName = ref;\n \t\t\tif (ref.startsWith(Constants.R_HEADS)) {\n@@ -152,18 +155,18 @@ private void fillTreeWithBranches(String select) throws IOException {\n \t\t\t\t\tcurSubPrefix = null;\n \t\t\t\t\tcurSubItem = null;\n \t\t\t\t\tcurItem = new TreeItem(branchTree, SWT.NONE);\n-\t\t\t\t\tcurItem.setText(\"Local Branches\");\n+\t\t\t\t\tcurItem.setText(UIText.BranchSelectionDialog_LocalBranches);\n \t\t\t\t}\n \t\t\t} else if (ref.startsWith(Constants.R_REMOTES)) {\n \t\t\t\tshortName = ref.substring(13);\n \t\t\t\tif (!Constants.R_REMOTES.equals(curPrefix)) {\n \t\t\t\t\tcurPrefix = Constants.R_REMOTES;\n \t\t\t\t\tcurItem = new TreeItem(branchTree, SWT.NONE);\n-\t\t\t\t\tcurItem.setText(\"Remote Branches\");\n+\t\t\t\t\tcurItem.setText(UIText.BranchSelectionDialog_RemoteBranches);\n \t\t\t\t\tcurSubItem = null;\n \t\t\t\t\tcurSubPrefix = null;\n-\t\t\t\t} \n-\t\t\t\t\n+\t\t\t\t}\n+\n \t\t\t\tint slashPos = shortName.indexOf(\"/\");\n \t\t\t\tif (slashPos > -1) {\n \t\t\t\t\tString remoteName = shortName.substring(0, slashPos);\n@@ -184,7 +187,7 @@ private void fillTreeWithBranches(String select) throws IOException {\n \t\t\t\t\tcurSubPrefix = null;\n \t\t\t\t\tcurSubItem = null;\n \t\t\t\t\tcurItem = new TreeItem(branchTree, SWT.NONE);\n-\t\t\t\t\tcurItem.setText(\"Tags\");\n+\t\t\t\t\tcurItem.setText(UIText.BranchSelectionDialog_Tags);\n \t\t\t\t}\n \t\t\t}\n \t\t\tTreeItem item;\n@@ -195,7 +198,7 @@ else if (curSubItem == null)\n \t\t\telse item = new TreeItem(curSubItem, SWT.NONE);\n \t\t\titem.setData(ref);\n \t\t\tif (ref.equals(branch)) {\n-\t\t\t\titem.setText(shortName + \" (current)\");\n+\t\t\t\titem.setText(shortName + UIText.BranchSelectionDialog_BranchSuffix_Current);\n \t\t\t\tFontData fd = item.getFont().getFontData()[0];\n \t\t\t\tfd.setStyle(fd.getStyle() | SWT.BOLD);\n \t\t\t\tfinal Font f = new Font(getShell().getDisplay(), fd);\n@@ -212,9 +215,9 @@ public void widgetDisposed(DisposeEvent e) {\n \t\t\t\tbranchTree.select(item);\n \t\t}\n \t}\n-\t\n+\n \tprivate String refName = null;\n-\t\n+\n \t/**\n \t * @return Selected ref\n \t */\n@@ -223,32 +226,34 @@ public String getRefName() {\n \t}\n \n \tprivate ResetType resetType = ResetType.MIXED;\n-\t\n+\n \t/**\n \t * @return Type of Reset\n \t */\n \tpublic ResetType getResetType() {\n \t\treturn resetType;\n \t}\n-\t\n+\n \t@Override\n \tprotected void okPressed() {\n \t\trefNameFromDialog();\n \t\tif (refName == null) {\n-\t\t\tMessageDialog.openWarning(getShell(), \"No branch/tag selected\", \"You must select a valid ref.\");\n+\t\t\tMessageDialog.openWarning(getShell(),\n+\t\t\t\t\tUIText.BranchSelectionDialog_NoBranchSeletectTitle,\n+\t\t\t\t\tUIText.BranchSelectionDialog_NoBranchSeletectMessage);\n \t\t\treturn;\n \t\t}\n-\t\t\n+\n \t\tif (showResetType) {\n \t\t\tif (resetType == ResetType.HARD) {\n-\t\t\t\tif (!MessageDialog.openQuestion(getShell(), \"Really reset?\", \n-\t\t\t\t\t\t\"Resetting will overwrite any changes in your working directory.\\n\\n\" +\n-\t\t\t\t\"Do you wish to continue?\")) {\n+\t\t\t\tif (!MessageDialog.openQuestion(getShell(),\n+\t\t\t\t\t\tUIText.BranchSelectionDialog_ReallyResetTitle,\n+\t\t\t\t\t\tUIText.BranchSelectionDialog_ReallyResetMessage)) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n-\t\t\n+\n \t\tsuper.okPressed();\n \t}\n \n@@ -266,7 +271,7 @@ protected void createButtonsForButtonBar(Composite parent) {\n \t\tif (!showResetType) {\n \t\t\tButton newButton = new Button(parent, SWT.PUSH);\n \t\t\tnewButton.setFont(JFaceResources.getDialogFont());\n-\t\t\tnewButton.setText(\"New branch\");\n+\t\t\tnewButton.setText(UIText.BranchSelectionDialog_NewBranch);\n \t\t\t((GridLayout)parent.getLayout()).numColumns++;\n \t\t\tnewButton.addSelectionListener(new SelectionListener() {\n \n@@ -276,20 +281,20 @@ public void widgetSelected(SelectionEvent e) {\n \n \t\t\t\t\tInputDialog labelDialog = new InputDialog(\n \t\t\t\t\t\t\tgetShell(),\n-\t\t\t\t\t\t\t\"New branch\",\n-\t\t\t\t\t\t\t\"Enter name of new branch. It will branch from the selected branch. refs/heads/ will be prepended to the name you type\",\n+\t\t\t\t\t\t\tUIText.BranchSelectionDialog_QuestionNewBranchTitle,\n+\t\t\t\t\t\t\tUIText.BranchSelectionDialog_QuestionNewBranchMessage,\n \t\t\t\t\t\t\tnull, new IInputValidator() {\n \t\t\t\t\t\t\t\tpublic String isValid(String newText) {\n \t\t\t\t\t\t\t\t\tString testFor = Constants.R_HEADS + newText;\n \t\t\t\t\t\t\t\t\ttry {\n \t\t\t\t\t\t\t\t\t\tif (repo.resolve(testFor) != null)\n-\t\t\t\t\t\t\t\t\t\t\treturn \"Already exists\";\n+\t\t\t\t\t\t\t\t\t\t\treturn UIText.BranchSelectionDialog_ErrorAlreadyExists;\n \t\t\t\t\t\t\t\t\t} catch (IOException e1) {\n-\t\t\t\t\t\t\t\t\t\tActivator.logError(String.format(\n-\t\t\t\t\t\t\t\t\t\t\t\t\"Could not attempt to resolve %s\", testFor), e1);\n+\t\t\t\t\t\t\t\t\t\tActivator.logError(NLS.bind(\n+\t\t\t\t\t\t\t\t\t\t\t\tUIText.BranchSelectionDialog_ErrorCouldNotResolve, testFor), e1);\n \t\t\t\t\t\t\t\t\t}\n \t\t\t\t\t\t\t\t\tif (!Repository.isValidRefName(testFor))\n-\t\t\t\t\t\t\t\t\t\treturn \"Invalid ref name\";\n+\t\t\t\t\t\t\t\t\t\treturn UIText.BranchSelectionDialog_ErrorInvalidRefName;\n \t\t\t\t\t\t\t\t\treturn null;\n \t\t\t\t\t\t\t\t}\n \t\t\t\t\t\t\t});\n@@ -307,14 +312,17 @@ public String isValid(String newText) {\n \t\t\t\t\t\t\tupdateRef.setNewObjectId(startAt);\n \t\t\t\t\t\t\tupdateRef.update();\n \t\t\t\t\t\t} catch (IOException e1) {\n-\t\t\t\t\t\t\tActivator.logError(String.format(\n-\t\t\t\t\t\t\t\t\t\"Could not create new ref %s\", newRefName), e1);\n+\t\t\t\t\t\t\tActivator.logError(NLS.bind(\n+\t\t\t\t\t\t\t\t\tUIText.BranchSelectionDialog_ErrorCouldNotCreateNewRef,\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnewRefName), e1);\n \t\t\t\t\t\t}\n \t\t\t\t\t\ttry {\n \t\t\t\t\t\t\tbranchTree.removeAll();\n \t\t\t\t\t\t\tfillTreeWithBranches(newRefName);\n \t\t\t\t\t\t} catch (IOException e1) {\n-\t\t\t\t\t\t\tActivator.logError(\"Could not refresh list of branches\",e1);\n+\t\t\t\t\t\t\tActivator.logError(\n+\t\t\t\t\t\t\t\t\tUIText.BranchSelectionDialog_ErrorCouldNotRefreshBranchList,\n+\t\t\t\t\t\t\t\t\t\t\te1);\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n@@ -324,7 +332,9 @@ public void widgetDefaultSelected(SelectionEvent e) {\n \t\t\t\t}\n \t\t\t});\n \t\t}\n-\t\tcreateButton(parent, IDialogConstants.OK_ID, showResetType ? \"Reset\" : \"Checkout\", true);\n+\t\tcreateButton(parent, IDialogConstants.OK_ID,\n+\t\t\t\tshowResetType ? UIText.BranchSelectionDialog_OkReset\n+\t\t\t\t\t\t: UIText.BranchSelectionDialog_OkCheckout, true);\n \t\tcreateButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);\n \t}\n \ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\nindex 98ce80f..0c85378 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n@@ -288,3 +288,28 @@ WindowCachePreferencePage_packedGitWindowSize=Window size:\n WindowCachePreferencePage_packedGitLimit=Window cache limit:\n WindowCachePreferencePage_deltaBaseCacheLimit=Delta base cache limit:\n WindowCachePreferencePage_packedGitMMAP=Use virtual memory mapping\n+\n+BranchSelectionDialog_BranchSuffix_Current=\\ (current)\n+BranchSelectionDialog_ErrorAlreadyExists=Already exists\n+BranchSelectionDialog_ErrorCouldNotCreateNewRef=Could not create new ref {0}\n+BranchSelectionDialog_ErrorCouldNotRefresh=Could not refresh list of branches\n+BranchSelectionDialog_ErrorCouldNotRefreshBranchList=Could not refresh list of branches\n+BranchSelectionDialog_ErrorCouldNotResolve=Could not attempt to resolve {0}\n+BranchSelectionDialog_ErrorInvalidRefName=Invalid ref name\n+BranchSelectionDialog_LocalBranches=Local Branches\n+BranchSelectionDialog_NewBranch=&New branch\n+BranchSelectionDialog_NoBranchSeletectMessage=You must select a valid ref.\n+BranchSelectionDialog_NoBranchSeletectTitle=No branch/tag selected\n+BranchSelectionDialog_OkCheckout=&Checkout\n+BranchSelectionDialog_OkReset=&Reset\n+BranchSelectionDialog_QuestionNewBranchMessage=Enter name of new branch. It will branch from the selected branch. refs/heads/ will be prepended to the name you type\n+BranchSelectionDialog_QuestionNewBranchTitle=New branch\n+BranchSelectionDialog_ReallyResetMessage=Resetting will overwrite any changes in your working directory.\\n\\nDo you wish to continue?\n+BranchSelectionDialog_ReallyResetTitle=Really reset?\n+BranchSelectionDialog_RemoteBranches=Remote Branches\n+BranchSelectionDialog_ResetType=Reset Type\n+BranchSelectionDialog_ResetTypeHard=&Hard\n+BranchSelectionDialog_ResetTypeMixed=&Mixed (working directory unmodified)\n+BranchSelectionDialog_ResetTypeSoft=&Soft (Index and working directory unmodified)\n+BranchSelectionDialog_Tags=Tags\n+BranchSelectionDialog_Refs=&Refs\n-- \n1.6.1.rc3.56.gd0306\n"},{"id":"99970","messageId":"1231690736-6452-2-git-send-email-robin.rosenberg@dewire.com","threadId":"17088","inReplyTo":"1231690736-6452-1-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 2/2] Add a border to the refs tree in the branch dialog","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2009-01-11T16:18:56Z","receivedAt":"2009-01-11T16:18:56Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../ui/internal/dialogs/BranchSelectionDialog.java |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java\nindex 8859b5d..db9adf0 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java\n@@ -87,7 +87,7 @@ protected Composite createDialogArea(Composite base) {\n \t\tparent = (Composite) super.createDialogArea(base);\n \t\tparent.setLayout(GridLayoutFactory.swtDefaults().create());\n \t\tnew Label(parent, SWT.NONE).setText(UIText.BranchSelectionDialog_Refs);\n-\t\tbranchTree = new Tree(parent, SWT.NONE);\n+\t\tbranchTree = new Tree(parent, SWT.BORDER);\n \t\tbranchTree.setLayoutData(GridDataFactory.fillDefaults().grab(true,true).hint(500, 300).create());\n \n \t\tif (showResetType) {\n-- \n1.6.1.rc3.56.gd0306\n"}]}