Fix Manifest warning and deprecation.

This commit is contained in:
peterdell 2019-08-31 09:27:12 +02:00
parent 3686357c6e
commit 550fe9aa18
29 changed files with 1705 additions and 22 deletions

View File

@ -8,3 +8,4 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Localization: plugin
Require-Bundle: com.wudsn.ide.asm
Bundle-ActivationPolicy: lazy
Automatic-Module-Name: com.wudsn.ide.asm.compilers.test

View File

@ -10,3 +10,4 @@ Require-Bundle: com.wudsn.ide.asm,
org.eclipse.ui.ide
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
Automatic-Module-Name: com.wudsn.ide.asm.compilers

View File

@ -82,3 +82,4 @@ Export-Package: com.wudsn.ide.asm;
org.eclipse.core.runtime.preferences,
org.eclipse.swt.widgets",
com.wudsn.ide.asm.runner;uses:="com.wudsn.ide.asm"
Automatic-Module-Name: com.wudsn.ide.asm

View File

@ -24,3 +24,4 @@ Export-Package: com.wudsn.ide.base,
com.wudsn.ide.base.editor.hex,
com.wudsn.ide.base.gui
Import-Package: org.eclipse.ui.internal.editors.text
Automatic-Module-Name: com.wudsn.ide.base

View File

@ -276,16 +276,17 @@ public final class HexEditor extends EditorPart implements ISelectionProvider, A
dataToUi();
}
@SuppressWarnings("unchecked")
@Override
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
public <T> T getAdapter(Class<T> adapter) {
if (adapter != null && IContentOutlinePage.class.equals(adapter)) {
if (contentOutlinePage == null) {
contentOutlinePage = new HexEditorContentOutlinePage(this);
contentOutlinePage.setInput(parserComponent.getOutlineBlocks());
}
return contentOutlinePage;
return (T)contentOutlinePage;
}
return super.getAdapter(adapter);
}

View File

@ -15,3 +15,4 @@ Bundle-ActivationPolicy: lazy
Export-Package: com.webcodepro.applecommander.storage
Bundle-ClassPath: lib/AppleCommander-1.3.5.14.jar,
.
Automatic-Module-Name: com.wudsn.ide.dsk

View File

@ -19,3 +19,4 @@ Export-Package: com.wudsn.ide.gfx.editor
Bundle-ClassPath: lib/js.jar,
lib/recoil.jar,
.
Automatic-Module-Name: com.wudsn.ide.gfx

Binary file not shown.

View File

@ -0,0 +1,58 @@
/**
* Copyright (C) 2009 - 2019 <a href="https://www.wudsn.com" target="_top">Peter Dell</a>
*
* This file is part of WUDSN IDE.
*
* WUDSN IDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* WUDSN IDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with WUDSN IDE. If not, see <http://www.gnu.org/licenses/>.
*/
package com.wudsn.ide.gfx.converter.generic;
import com.wudsn.ide.gfx.converter.Converter;
import com.wudsn.ide.gfx.converter.FilesConverterData;
import net.sf.recoil.RECOIL;
/**
* Generic converter based on <a href="http://recoil.sourceforge.net">RECOIL</a>
* by Piotr Fusik, Adrian Matoga et. al.
*
* @author Peter Dell
*/
public class RecoilConverter extends Converter {
public static final int SOURCE_FILE = 1;
@Override
public void convertToImageDataSize(FilesConverterData data) {
RECOIL recoil = new RECOIL();
byte[] content = data.getSourceFileBytes(SOURCE_FILE);
boolean valid = recoil.decode(data.getParameters().getSourceFile(SOURCE_FILE).getPath(), content,
content.length);
if (valid) {
data.setImageDataHeight(recoil.getHeight());
data.setImageDataWidth(recoil.getWidth());
}
}
@Override
public boolean convertToImageData(FilesConverterData data) {
RECOIL recoil = new RECOIL();
byte[] content = data.getSourceFileBytes(SOURCE_FILE);
boolean valid = recoil.decode(data.getParameters().getSourceFile(SOURCE_FILE).getPath(), content,
content.length);
return valid;
}
}

View File

@ -9,3 +9,4 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Automatic-Module-Name: com.wudsn.ide.hex

View File

@ -0,0 +1,65 @@
org $2000
buffer_mode=0
icl "snd/Sound.asm"
org $4000
.proc main
mwa #dl 560
mva #>charset 756
; jsr sound.stop
ldx #<sound.module
ldy #>sound.module
lda #0
jsr sound.init
loop lda #15
@ cmp $d40b
bne @-
jsr sound.play
@ lda $d40b
sta $d01a
cmp #112
bne @-
lda #0
sta $d01a
jmp loop
jsr sound.stop
jmp $e474
.endp
org $5000
.local charset
ins 'gfx/Charset.chr'
.endl
.local dl
:3 .byte $70
.byte $42, a(text)
.byte $4f, a(picture)
:95 .byte $0f
.byte $4f, a(picture+96*40)
:95 .byte $0f
.byte $41, a(dl)
.endl
.local text
.byte "Hello Fuji!"
.endl
org $6100
.local picture
ins 'gfx/Image.pic'
.endl
run main

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,42 @@
#WUDSN IDE Converter Parameters
#Fri Aug 30 12:11:55 CEST 2019
converterDirection=IMAGE_TO_FILES
filesConverterParameters.converterId=
filesConverterParameters.imageAspect.factorX=1
filesConverterParameters.imageAspect.factorY=1
filesConverterParameters.displayAspect.factorX=1
filesConverterParameters.displayAspect.factorY=1
filesConverterParameters.displayShrinkToFit=false
filesConverterParameters.displayZoomToFit=true
filesConverterParameters.sourceFiles=0
filesConverterParameters.imageFilePath=
filesConverterParameters.columns=40
filesConverterParameters.rows=24
filesConverterParameters.spacingColor.red=0
filesConverterParameters.spacingColor.green=0
filesConverterParameters.spacingColor.blue=128
filesConverterParameters.spacingWidth=0
filesConverterParameters.palette=HIRES_1
filesConverterParameters.paletteType=ATARI_DEFAULT
filesConverterParameters.paletteRGBs=0
imageConverterParameters.converterId=com.wudsn.ide.gfx.converter.generic.CharSet1x1HiresConverter
imageConverterParameters.imageAspect.factorX=1
imageConverterParameters.imageAspect.factorY=1
imageConverterParameters.displayAspect.factorX=1
imageConverterParameters.displayAspect.factorY=1
imageConverterParameters.displayShrinkToFit=false
imageConverterParameters.displayZoomToFit=true
imageConverterParameters.imageFilePath=Charset.png
imageConverterParameters.targetFiles=10
imageConverterParameters.targetFiles.0.path=Charset.chr
imageConverterParameters.targetFiles.1.path=
imageConverterParameters.targetFiles.2.path=
imageConverterParameters.targetFiles.3.path=
imageConverterParameters.targetFiles.4.path=
imageConverterParameters.targetFiles.5.path=
imageConverterParameters.targetFiles.6.path=
imageConverterParameters.targetFiles.7.path=
imageConverterParameters.targetFiles.8.path=
imageConverterParameters.targetFiles.9.path=
imageConverterParameters.useDefaultScript=true
imageConverterParameters.script=function convertToFileData(data) {\r\n\tvar columns \= data.getImageDataWidth() / 8;\r\n\tvar rows \= data.getImageDataHeight() / 8;\r\n\tvar chars \= 256;\r\n\r\n\tvar char \= 0;\r\n\tvar bytes \= [];\r\n\tvar offset \= 0;\r\n\tfor (var r \= 0; r < rows; r++) {\r\n\t\tfor (var c \= 0; c < columns; c++) {\r\n\t\t\tif (char < chars) {\r\n\t\t\t\tfor (var l\=0;l<8;l++) {\r\n\t\t\t\t\tvar b \= 0;\r\n\t\t\t\t\tfor (var p \= 0; p < 8; p++) {\r\n\t\t \t\t\tvar color;\r\n\t\t \t\t\tcolor \= data.getPixel(c*8+p, r*8+l);\r\n\t\t \t\t\tif (color \!\= 0) {\r\n\t\t\t\t\t\t\tb \= b | 1 << 7 - p;\r\n\t\t \t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbytes[offset++] \= b;\r\n \t\t\t}\r\n\t\t\tchar++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tdata.setTargetFileObject(0, bytes);\r\n}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 B

View File

@ -0,0 +1,42 @@
#WUDSN IDE Converter Parameters
#Fri Aug 30 12:27:38 CEST 2019
converterDirection=IMAGE_TO_FILES
filesConverterParameters.converterId=
filesConverterParameters.imageAspect.factorX=1
filesConverterParameters.imageAspect.factorY=1
filesConverterParameters.displayAspect.factorX=1
filesConverterParameters.displayAspect.factorY=1
filesConverterParameters.displayShrinkToFit=false
filesConverterParameters.displayZoomToFit=true
filesConverterParameters.sourceFiles=0
filesConverterParameters.imageFilePath=
filesConverterParameters.columns=40
filesConverterParameters.rows=24
filesConverterParameters.spacingColor.red=0
filesConverterParameters.spacingColor.green=0
filesConverterParameters.spacingColor.blue=128
filesConverterParameters.spacingWidth=0
filesConverterParameters.palette=HIRES_1
filesConverterParameters.paletteType=ATARI_DEFAULT
filesConverterParameters.paletteRGBs=0
imageConverterParameters.converterId=com.wudsn.ide.gfx.converter.atari8bit.LinearBitMapGraphics8Converter
imageConverterParameters.imageAspect.factorX=1
imageConverterParameters.imageAspect.factorY=1
imageConverterParameters.displayAspect.factorX=1
imageConverterParameters.displayAspect.factorY=1
imageConverterParameters.displayShrinkToFit=false
imageConverterParameters.displayZoomToFit=true
imageConverterParameters.imageFilePath=Image.png
imageConverterParameters.targetFiles=10
imageConverterParameters.targetFiles.0.path=Image.pic
imageConverterParameters.targetFiles.1.path=
imageConverterParameters.targetFiles.2.path=
imageConverterParameters.targetFiles.3.path=
imageConverterParameters.targetFiles.4.path=
imageConverterParameters.targetFiles.5.path=
imageConverterParameters.targetFiles.6.path=
imageConverterParameters.targetFiles.7.path=
imageConverterParameters.targetFiles.8.path=
imageConverterParameters.targetFiles.9.path=
imageConverterParameters.useDefaultScript=true
imageConverterParameters.script=function convertToFileData(data) {\r\n\tvar bpsl \= (data.getImageDataWidth() + 7) / 8;\r\n\tvar bytes \= [];\r\n\tvar offset \= 0;\r\n\tfor (var y \= 0; y < data.getImageDataHeight(); y++) {\r\n\t for (var x \= 0; x < data.getImageDataWidth(); x \= x + 8) {\r\n\t\t\tvar b \= 0;\r\n\t\t\tfor (var p \= 0; p < 8; p++) {\r\n\t\t\t var color;\r\n\t\t\t color \= data.getPixel(x + p, y);\r\n\t\t\t if (color \!\= 0) {\r\n\t\t\t\t\tb \= b | 1 << 7 - p;\r\n\t\t\t }\r\n\t\t\t}\r\n\t\t\tbytes[offset++] \= b;\r\n\t }\r\n\t}\r\n\tdata.setTargetFileObject(0, bytes);\r\n}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,87 @@
/*
RMT Relocator v1.1 (16.12.2008)
Example:
rmt_relocator 'file.rmt' , new_address
*/
.macro rmt_relocator
.get [$100] :1,0,6 // wczytujemy plik do bufora MADS'a
ert (.get[$100] + .get[$101]<<8) <> $FFFF , 'Bad file format'
new_add = :2 // nowy adres dla modulu RMT
old_add = .get[$102] + .get[$103]<<8 // stary adres modulu RMT
length = .get[$104] + .get[$105]<<8 - old_add + 1 // dlugosc pliku RMT bez naglowka DOS'u
ofset = new_add-old_add
.get [old_add-6] :1
.put[old_add-4] = .lo(new_add) // poprawiamy nag³ówek DOS'a
.put[old_add-3] = .hi(new_add) // tak aby zawieral informacje o nowym
.put[old_add-2] = .lo(new_add + length - 1) // adresie modulu RMT
.put[old_add-1] = .hi(new_add + length - 1)
type = .get[old_add+3]
pinst = .get[old_add+8] + .get[old_add+9]<<8
pltrc = .get[old_add+10] + .get[old_add+11]<<8
phtrc = .get[old_add+12] + .get[old_add+13]<<8
ptlst = .get[old_add+14] + .get[old_add+15]<<8
.put[old_add+8] = .lo(pinst+ofset)
.put[old_add+9] = .hi(pinst+ofset)
.put[old_add+10] = .lo(pltrc+ofset)
.put[old_add+11] = .hi(pltrc+ofset)
.put[old_add+12] = .lo(phtrc+ofset)
.put[old_add+13] = .hi(phtrc+ofset)
.put[old_add+14] = .lo(ptlst+ofset)
.put[old_add+15] = .hi(ptlst+ofset)
// ISTRUMENTS
.rept (pltrc-pinst)/2
?tmp = .get[pinst+#*2] + .get[pinst+#*2+1]<<8
.put[pinst+#*2] = .lo(?tmp+ofset)
.put[pinst+#*2+1] = .hi(?tmp+ofset)
.endr
// TRACKS
.rept phtrc-pltrc
?tmp = .get[pltrc+#] + .get[phtrc+#]<<8
ift ?tmp>0
.put[pltrc+#] = .lo(?tmp+ofset)
.put[phtrc+#] = .hi(?tmp+ofset)
eif
.endr
// TRACK LIST
ift type='8'
skip=8
els
skip=4
eif
.rept [(old_add+length-ptlst)/skip]+1
ift .get[ptlst+#*skip]=$fe
?tmp = .get[ptlst+#*skip+2] + .get[ptlst+#*skip+3]<<8
.put[ptlst+#*skip+2] = .lo(?tmp+ofset)
.put[ptlst+#*skip+3] = .hi(?tmp+ofset)
eif
.endr
.sav [old_add] length
.endm

View File

@ -0,0 +1,40 @@
;* --------BEGIN--------
FEAT_SFX equ 0
FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable
FEAT_NOSTARTINGSONGLINE equ 0
FEAT_INSTRSPEED equ 3
FEAT_CONSTANTSPEED equ 6 ;(0 times)
FEAT_COMMAND1 equ 1 ;(25 times)
FEAT_COMMAND2 equ 0 ;(0 times)
FEAT_COMMAND3 equ 0 ;(0 times)
FEAT_COMMAND4 equ 0 ;(0 times)
FEAT_COMMAND5 equ 1 ;(2 times)
FEAT_COMMAND6 equ 1 ;(4 times)
FEAT_COMMAND7SETNOTE equ 0 ;(0 times)
FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times)
FEAT_PORTAMENTO equ 1 ;(10 times)
FEAT_FILTER equ 1 ;(20 times)
FEAT_FILTERG0L equ 1 ;(20 times)
FEAT_FILTERG1L equ 0 ;(0 times)
FEAT_FILTERG0R equ 0 ;(0 times)
FEAT_FILTERG1R equ 0 ;(0 times)
FEAT_BASS16 equ 0 ;(0 times)
FEAT_BASS16G1L equ 0 ;(0 times)
FEAT_BASS16G3L equ 0 ;(0 times)
FEAT_BASS16G1R equ 0 ;(0 times)
FEAT_BASS16G3R equ 0 ;(0 times)
FEAT_VOLUMEONLYG0L equ 0 ;(0 times)
FEAT_VOLUMEONLYG2L equ 0 ;(0 times)
FEAT_VOLUMEONLYG3L equ 0 ;(0 times)
FEAT_VOLUMEONLYG0R equ 0 ;(0 times)
FEAT_VOLUMEONLYG2R equ 0 ;(0 times)
FEAT_VOLUMEONLYG3R equ 0 ;(0 times)
FEAT_TABLETYPE equ 0 ;(0 times)
FEAT_TABLEMODE equ 0 ;(0 times)
FEAT_TABLEGO equ 0 ;(0 times)
FEAT_AUDCTLMANUALSET equ 0 ;(0 times)
FEAT_VOLUMEMIN equ 0 ;(0 times)
FEAT_EFFECTVIBRATO equ 1 ;(2 times)
FEAT_EFFECTFSHIFT equ 0 ;(0 times)
;* --------END--------

View File

@ -0,0 +1,94 @@
;
; >>> Fuji Demo by JAC! <<<
;
; Sound routines.
;
; @com.wudsn.ide.asm.mainsourcefile=..\Fuji.asm
.proc sound
STEREOMODE = 0 ;0 => compile RMTplayer for mono 4 tracks
; ;1 => compile RMTplayer for stereo 8 tracks
; ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4
; ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4
;
;
zp = 203 ;13 bytes of zero pages
player = $2400 ;Must be at page boundary, 1k before are used as scratch pad
init = player ;<A>=song number 0...255, <X>=lo byte of module, <Y>=hi byte of module
play = player+3 ;Play 1 step
stop = player+9 ;All sounds off
module = $3000 ;Target address of RMT module
icl "snd/RMT-Relocator.mac" ;Include relocator
org sound.player
icl "snd/RMT-Player.asm" ;Include RMT player routine
; .if buffer_mode = 1
; .proc buffer ;Buffer for multi speed replay
; STEPS = 3
;
; .proc copy_to_buffer ;Copy replay result to buffer
;count = *+1
; ldx #0
; mva v_audctl data.v_audctl,x
; .rept TRACKS
; mva trackn_audf+# data.trackn_audf+#*STEPS,x
; mva trackn_audc+# data.trackn_audc+#*STEPS,x
; .endr
;
; inx
; cpx #STEPS
; sne
; ldx #0
; stx count
; rts
; .endp
;
; .proc copy_from_buffer ;Copy buffer to replay result
;count = *+1
; ldx #0
; .rept TRACKS
; lda data.trackn_audf+#*STEPS,x
; ldy data.trackn_audc+#*STEPS,x
; sta $d200+#*2
; sty $d201+#*2
; .endr
; mva data.v_audctl,x $d208
;
; inx
; cpx #STEPS
; sne
; ldx #0
; stx count
; rts
; .endp
;
; .local data
; .local v_audctl
;:STEPS .byte 0
; .endl
;
; .local trackn_audf
;:STEPS*TRACKS .byte 0
; .endl
;
; .local trackn_audc
;:STEPS*TRACKS .byte 0
; .endl
; .endl
;
; .endp
;
; .endif
org sound.module ;Inxlude stripped RMT
; RMT feature definitions file
; For optimizations of RMT player routine to concrete RMT module only!
icl "snd/Sound-Features.asm"
rmt_relocator 'snd/Sound.rmt' sound.module
.endp

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 885 B

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,32 +1,24 @@
#WUDSN IDE Converter Parameters
#Tue Jun 10 23:37:53 CEST 2014
#Fri Aug 30 12:10:47 CEST 2019
converterDirection=IMAGE_TO_FILES
filesConverterParameters.converterId=com.wudsn.ide.gfx.converter.generic.CharSet1x1HiresConverter
filesConverterParameters.converterId=
filesConverterParameters.imageAspect.factorX=1
filesConverterParameters.imageAspect.factorY=1
filesConverterParameters.displayAspect.factorX=1
filesConverterParameters.displayAspect.factorY=1
filesConverterParameters.displayShrinkToFit=false
filesConverterParameters.displayZoomToFit=true
filesConverterParameters.sourceFiles=1
filesConverterParameters.sourceFiles.0.path=Charset.chr
filesConverterParameters.sourceFiles.0.offset=0
filesConverterParameters.sourceFiles=0
filesConverterParameters.imageFilePath=
filesConverterParameters.columns=32
filesConverterParameters.rows=4
filesConverterParameters.columns=40
filesConverterParameters.rows=24
filesConverterParameters.spacingColor.red=0
filesConverterParameters.spacingColor.green=0
filesConverterParameters.spacingColor.blue=128
filesConverterParameters.spacingWidth=0
filesConverterParameters.palette=HIRES_1
filesConverterParameters.paletteType=ATARI_DEFAULT
filesConverterParameters.paletteRGBs=2
filesConverterParameters.paletteRGBs.0.red=0
filesConverterParameters.paletteRGBs.0.green=0
filesConverterParameters.paletteRGBs.0.blue=0
filesConverterParameters.paletteRGBs.1.red=255
filesConverterParameters.paletteRGBs.1.green=255
filesConverterParameters.paletteRGBs.1.blue=255
filesConverterParameters.paletteRGBs=0
imageConverterParameters.converterId=com.wudsn.ide.gfx.converter.generic.CharSet1x1HiresConverter
imageConverterParameters.imageAspect.factorX=1
imageConverterParameters.imageAspect.factorY=1
@ -36,7 +28,7 @@ imageConverterParameters.displayShrinkToFit=false
imageConverterParameters.displayZoomToFit=true
imageConverterParameters.imageFilePath=Charset.png
imageConverterParameters.targetFiles=10
imageConverterParameters.targetFiles.0.path=Charset.png.chr
imageConverterParameters.targetFiles.0.path=Charset.chr
imageConverterParameters.targetFiles.1.path=
imageConverterParameters.targetFiles.2.path=
imageConverterParameters.targetFiles.3.path=

View File

@ -18,3 +18,4 @@ Bundle-ClassPath: .,
lib/atari8bit/asap.jar,
lib/c64/jsidplay2.jar
Bundle-Vendor: Peter Dell
Automatic-Module-Name: com.wudsn.ide.snd

View File

@ -14,3 +14,4 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.ui.ide;bundle-version="3.9.1"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy; exclude:="com.wudsn.ide.tst.contenttypes"
Automatic-Module-Name: com.wudsn.ide.tst

View File

@ -15,7 +15,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
@ -156,9 +156,10 @@ public class ATASCIDocumentProvider extends FileDocumentProvider {
} else {
try {
monitor.beginTask("Saving...", 2000);
ContainerCreator creator = new ContainerCreator(file.getWorkspace(), file.getParent().getFullPath());
creator.createContainer(new SubProgressMonitor(monitor, 1000));
file.create(stream, false, new SubProgressMonitor(monitor, 1000));
ContainerCreator creator = new ContainerCreator(file.getWorkspace(),
file.getParent().getFullPath());
creator.createContainer(SubMonitor.convert(monitor, 1000));
file.create(stream, false, SubMonitor.convert(monitor, 1000));
} finally {
monitor.done();
}