folks
My form is very simple ,its has one botton and when I press the
botton I want to render table results of query but my knoledge of seaside framwork is weak. this is my method renderContentOn: html html form: [
html text: 'id_user: '. html textInput callback: [ :value | self nroDoc: value ];
value: nroDoc. html submitButton callback: [ "here i want to render table object"
self call: (self renderContentTableOn: html) ]; value: 'Save' ] . I'm doing something wrong because i have error. MessageNotUnderstood: receiver of "openTag:attributes:closed:" is nil. MessageNotUnderstood: receiver of "openTag:attributes:closed:" is nil.Any sugestions are welcomed
best jmdc _______________________________________________ seaside-dev mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/seaside-dev |
I don't think the problem is in the code you
posted. The SqueakDebug.log file would help.
Cheers, Bob On 6/12/13 4:04 PM, Juan wrote:
_______________________________________________ seaside-dev mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/seaside-dev |
Bob On Wed, Jun 12, 2013 at 5:15 PM, Bob Arning <[hidden email]> wrote: Thanks for response:The SqueakDebug.log file would help. You meant this ? THERE_BE_DRAGONS_HERE MessageNotUnderstood: receiver of "openTag:attributes:closed:" is nil 12 June 2013 5:13:27.566 pm
VM: Win32 - IX86 - 6.1 - NBCoInterpreter NativeBoost-CogPlugin-EstebanLorenzano.18 uuid: a53445f9-c0c0-4015-97a3-be7db8d9ed6b Mar 13 2013 NBCogit NativeBoost-CogPlugin-EstebanLorenzano.18 uuid: a53445f9-c0c0-4015-97a3-be7db8d9ed6b Mar 13 2013
git://gitorious.org/cogvm/blessed.git Commit: 412abef33cbed05cf1d75329e451d71c0c6aa5a7 Date: 2013-03-13 17:48:50 +0100 By: Esteban Lorenzano <[hidden email]> Jenkins build #14535
Image: Pharo2.0 [Latest update: #20596] UndefinedObject(Object)>>doesNotUnderstand: #openTag:attributes:closed:
Receiver: nil Arguments and temporary variables:
aMessage: openTag: 'form' attributes: a WAHtmlAttributes('accept-charset'->'utf...etc...
exception: MessageNotUnderstood: receiver of "openTag:attributes:closed:" is ni...etc...
resumeValue: nil Receiver's instance variables:
nil WAFormTag(WATagBrush)>>openTag Receiver: a WAFormTag
Arguments and temporary variables: Receiver's instance variables:
canvas: a WARenderCanvas parent: nil
closed: false attributes: a WAHtmlAttributes('accept-charset'->'utf-8' 'method'->'post' 'acti...etc...
defaultAction: nil
WAFormTag(WATagBrush)>>with: Receiver: a WAFormTag Arguments and temporary variables:
anObject: [html text: 'id_usuario: '. html textInput
callback: [:value | sel...etc... Receiver's instance variables:
canvas: a WARenderCanvas parent: nil
closed: false attributes: a WAHtmlAttributes('accept-charset'->'utf-8' 'method'->'post' 'acti...etc...
defaultAction: nil
WARenderCanvas(WAHtmlCanvas)>>form: Receiver: a WARenderCanvas Arguments and temporary variables:
aBlock: [html text: 'id_usuario: '. html textInput
callback: [:value | self ...etc... Receiver's instance variables:
context: a WARenderContext lastId: nil
currentBrush: a WAFormTag parentBrush: nil
XeliosApp>>renderContentOn: Receiver: a XeliosApp
Arguments and temporary variables: html: a WARenderCanvas
Receiver's instance variables: decoration: a WAValueHolder contents: a WAToolDecoration
conn: nil nroDocumento: '135138214'
[self renderContentOn: html] in [html text: 'id_usuario: '. html textInput
callback: [:value | self nroDocumento: value]; value: nroDocumento.
html submitButton callback: [self renderContentOn: html];
value: 'Save'] in XeliosApp>>renderContentOn: Receiver: a XeliosApp
Arguments and temporary variables: html: a WARenderCanvas
Receiver's instance variables: decoration: a WAValueHolder contents: a WAToolDecoration
conn: nil nroDocumento: '135138214'
BlockClosure>>valueWithPossibleArguments: Receiver: [self renderContentOn: html]
Arguments and temporary variables: anArray: #('Save')
args: #() Receiver's instance variables:
outerContext: [html text: 'id_usuario: '. html textInput
callback: [:value |...etc... startpc: 83
numArgs: 0
WAActionCallback>>evaluateWithArgument: Receiver: a WAActionCallback Arguments and temporary variables:
anObject: nil Receiver's instance variables:
key: '1' block: [self answer: true]
WAActionCallback(WACallback)>>evaluateWithFieldValues: Receiver: a WAActionCallback
Arguments and temporary variables: anOrderedCollection: #(nil)
Receiver's instance variables: key: '1'
block: [self answer: true] [:callback | callback evaluateWithFieldValues: (fields allAt: callback key)] in WACallbackRegistry>>handle:
Receiver: a WACallbackRegistry Arguments and temporary variables:
aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
set: a Set(a WAActionCallback) fields: a WAMergedRequestFields
callback: a WAActionCallback Receiver's instance variables:
callbacks: a Dictionary('1'->a WAActionCallback '10'->a WAActionCallback '11'->...etc...
nextKey: 19
Array(SequenceableCollection)>>do: Receiver: an Array(a WAActionCallback) Arguments and temporary variables:
aBlock: [:callback | callback evaluateWithFieldValues: (fields allAt: callbac...etc...
index: 1 indexLimiT: 1
Receiver's instance variables: an Array(a WAActionCallback)
WACallbackRegistry>>handle: Receiver: a WACallbackRegistry Arguments and temporary variables:
aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
set: a Set(a WAActionCallback) fields: a WAMergedRequestFields
Receiver's instance variables: callbacks: a Dictionary('1'->a WAActionCallback '10'->a WAActionCallback '11'->...etc...
nextKey: 19
[self renderContext callbacks handle: self requestContext] in [self withNotificationHandlerDo: [self renderContext callbacks handle: self requestContext].
(WAVisiblePresenterGuide client: WATaskVisitor new) start: self presenter] in WAActionPhaseContinuation>>runCallbacks
Receiver: a WAActionPhaseContinuation Arguments and temporary variables:
Receiver's instance variables: states: a WASnapshot
renderContext: a WARenderContext BlockClosure>>on:do: Receiver: [self renderContext callbacks handle: self requestContext]
Arguments and temporary variables: exception: WARenderNotification
handlerAction: [:n | nil] handlerActive: true
Receiver's instance variables: outerContext: [self
withNotificationHandlerDo: [self renderContext callbacks ...etc... startpc: 82
numArgs: 0
WAActionPhaseContinuation(WARenderLoopContinuation)>>withNotificationHandlerDo: Receiver: a WAActionPhaseContinuation
Arguments and temporary variables: aBlock: [self renderContext callbacks handle: self requestContext]
Receiver's instance variables: states: a WASnapshot
renderContext: a WARenderContext [self withNotificationHandlerDo: [self renderContext callbacks handle: self requestContext].
(WAVisiblePresenterGuide client: WATaskVisitor new) start: self presenter] in WAActionPhaseContinuation>>runCallbacks
Receiver: a WAActionPhaseContinuation Arguments and temporary variables:
Receiver's instance variables: states: a WASnapshot
renderContext: a WARenderContext BlockClosure>>ensure: Receiver: [self withNotificationHandlerDo: [self renderContext callbacks handle: self requestConte...etc...
Arguments and temporary variables: aBlock: [self request isXmlHttpRequest
ifTrue: [self captureState]] complete: nil
returnValue: nil Receiver's instance variables:
outerContext: WAActionPhaseContinuation>>runCallbacks startpc: 77
numArgs: 0
WAActionPhaseContinuation>>runCallbacks Receiver: a WAActionPhaseContinuation Arguments and temporary variables:
Receiver's instance variables: states: a WASnapshot
renderContext: a WARenderContext WAActionPhaseContinuation>>handleRequest Receiver: a WAActionPhaseContinuation
Arguments and temporary variables: Receiver's instance variables:
states: a WASnapshot renderContext: a WARenderContext
[self handleRequest] in WAActionPhaseContinuation(WASessionContinuation)>>basicValue Receiver: a WAActionPhaseContinuation
Arguments and temporary variables: Receiver's instance variables:
states: a WASnapshot renderContext: a WARenderContext
BlockClosure>>on:do: Receiver: [self handleRequest]
Arguments and temporary variables: exception: WAUnregisteredHandlerError
handlerAction: [:err | self requestContext redirectTo: self application url]
handlerActive: true Receiver's instance variables:
outerContext: WAActionPhaseContinuation(WASessionContinuation)>>basicValue
startpc: 26 numArgs: 0
WAActionPhaseContinuation(WASessionContinuation)>>withUnregisteredHandlerDo: Receiver: a WAActionPhaseContinuation
Arguments and temporary variables: aBlock: [self handleRequest]
Receiver's instance variables: states: a WASnapshot
renderContext: a WARenderContext WAActionPhaseContinuation(WASessionContinuation)>>basicValue Receiver: a WAActionPhaseContinuation
Arguments and temporary variables: Receiver's instance variables:
states: a WASnapshot renderContext: a WARenderContext
WAActionPhaseContinuation(WASessionContinuation)>>value Receiver: a WAActionPhaseContinuation
Arguments and temporary variables: Receiver's instance variables:
states: a WASnapshot renderContext: a WARenderContext
WASession>>handleFiltered: Receiver: a WASession
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
key: 'oUnvZdBBK9C3msZm' continuation: a WAActionPhaseContinuation
Receiver's instance variables: filter: a WAValueHolder contents: a WAMutualExclusionFilter
parent: a WAApplication configuration: a WAUserConfiguration
continuations: a WACache properties: a GRSmallDictionary(#presenter->a XeliosApp)
jumpTo: nil
WATimingToolFilter(WARequestFilter)>>handleFiltered: Receiver: a WATimingToolFilter Arguments and temporary variables:
aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WASession
startTime: 9397852 previousTiming: 6
[super handleFiltered: aRequestContext] in WATimingToolFilter>>handleFiltered: Receiver: a WATimingToolFilter
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WASession
startTime: 9397852 previousTiming: 6
BlockClosure>>ensure: Receiver: [super handleFiltered: aRequestContext]
Arguments and temporary variables: aBlock: [previousTiming := self currentTiming]
complete: nil returnValue: nil
Receiver's instance variables: outerContext: WATimingToolFilter>>handleFiltered:
startpc: 41 numArgs: 0
WATimingToolFilter>>handleFiltered: Receiver: a WATimingToolFilter
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WASession
startTime: 9397852 previousTiming: 6
WADeprecatedToolFilter(WARequestFilter)>>handleFiltered: Receiver: a WADeprecatedToolFilter
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WATimingToolFilter
notifications: an OrderedCollection() [super handleFiltered: aRequestContext] in WADeprecatedToolFilter>>handleFiltered: Receiver: a WADeprecatedToolFilter
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WATimingToolFilter
notifications: an OrderedCollection() BlockClosure>>on:do: Receiver: [super handleFiltered: aRequestContext] Arguments and temporary variables:
exception: GRDeprecatedApiNotification handlerAction: [:notification | self deprecated: notification]
handlerActive: true Receiver's instance variables:
outerContext: WADeprecatedToolFilter>>handleFiltered: startpc: 34
numArgs: 0
WADeprecatedToolFilter>>handleFiltered: Receiver: a WADeprecatedToolFilter Arguments and temporary variables:
aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WATimingToolFilter
notifications: an OrderedCollection() WAMutualExclusionFilter(WARequestFilter)>>handleFiltered: Receiver: a WAMutualExclusionFilter
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WADeprecatedToolFilter
mutex: a WAMutex
[super handleFiltered: aRequestContext] in WAMutualExclusionFilter>>handleFiltered: Receiver: a WAMutualExclusionFilter
Arguments and temporary variables: aRequestContext: a WARequestContext url: '/XeliosApp?_s=el9s4sJrdtt_Nodo&_k=oUn...etc...
Receiver's instance variables: next: a WAValueHolder contents: a WADeprecatedToolFilter
mutex: a WAMutex
BlockClosure>>ensure: Receiver: [super handleFiltered: aRequestContext] Arguments and temporary variables:
aBlock: [owner := nil] complete: nil
returnValue: nil Receiver's instance variables:
outerContext: WAMutualExclusionFilter>>handleFiltered: startpc: 48
numArgs: 0
[owner := process. aBlock ensure: [owner := nil]] in WAMutex>>critical:
Receiver: a WAMutex Arguments and temporary variables:
aBlock: [super handleFiltered: aRequestContext] process: a Process in GRPharoPlatform>>openDebuggerOn:
Receiver's instance variables: semaphore: a Semaphore()
owner: a Process in GRPharoPlatform>>openDebuggerOn: [caught := true. self wait. blockValue := mutuallyExcludedBlock value] in Semaphore>>critical:
Receiver: a Semaphore() Arguments and temporary variables:
mutuallyExcludedBlock: [owner := process. aBlock
ensure: [owner := nil]] blockValue: nil
caught: true Receiver's instance variables:
firstLink: nil lastLink: nil
excessSignals: 0
BlockClosure>>ensure: Receiver: [caught := true. self wait.
blockValue := mutuallyExcludedBlock value] Arguments and temporary variables:
aBlock: [caught ifTrue: [self signal]]
complete: nil returnValue: nil
Receiver's instance variables: outerContext: Semaphore>>critical:
startpc: 42 numArgs: 0
--- The full stack --- UndefinedObject(Object)>>doesNotUnderstand: #openTag:attributes:closed:
WAFormTag(WATagBrush)>>openTag WAFormTag(WATagBrush)>>with: WARenderCanvas(WAHtmlCanvas)>>form:
XeliosApp>>renderContentOn: [self renderContentOn: html] in [html text: 'id_usuario: '. html textInput
callback: [:value | self nroDocumento: value]; value: nroDocumento.
html submitButton callback: [self renderContentOn: html];
value: 'Save'] in XeliosApp>>renderContentOn: BlockClosure>>valueWithPossibleArguments: WAActionCallback>>evaluateWithArgument:
WAActionCallback(WACallback)>>evaluateWithFieldValues: [:callback | callback evaluateWithFieldValues: (fields allAt: callback key)] in WACallbackRegistry>>handle:
Array(SequenceableCollection)>>do: WACallbackRegistry>>handle: [self renderContext callbacks handle: self requestContext] in [self
withNotificationHandlerDo: [self renderContext callbacks handle: self requestContext]. (WAVisiblePresenterGuide client: WATaskVisitor new)
start: self presenter] in WAActionPhaseContinuation>>runCallbacks BlockClosure>>on:do:
WAActionPhaseContinuation(WARenderLoopContinuation)>>withNotificationHandlerDo: [self withNotificationHandlerDo: [self renderContext callbacks handle: self requestContext].
(WAVisiblePresenterGuide client: WATaskVisitor new) start: self presenter] in WAActionPhaseContinuation>>runCallbacks
BlockClosure>>ensure: WAActionPhaseContinuation>>runCallbacks WAActionPhaseContinuation>>handleRequest
[self handleRequest] in WAActionPhaseContinuation(WASessionContinuation)>>basicValue BlockClosure>>on:do: WAActionPhaseContinuation(WASessionContinuation)>>withUnregisteredHandlerDo:
WAActionPhaseContinuation(WASessionContinuation)>>basicValue WAActionPhaseContinuation(WASessionContinuation)>>value WASession>>handleFiltered:
WATimingToolFilter(WARequestFilter)>>handleFiltered: [super handleFiltered: aRequestContext] in WATimingToolFilter>>handleFiltered:
BlockClosure>>ensure: WATimingToolFilter>>handleFiltered: WADeprecatedToolFilter(WARequestFilter)>>handleFiltered:
[super handleFiltered: aRequestContext] in WADeprecatedToolFilter>>handleFiltered: BlockClosure>>on:do: WADeprecatedToolFilter>>handleFiltered:
WAMutualExclusionFilter(WARequestFilter)>>handleFiltered: [super handleFiltered: aRequestContext] in WAMutualExclusionFilter>>handleFiltered:
BlockClosure>>ensure: [owner := process. aBlock ensure: [owner := nil]] in WAMutex>>critical:
[caught := true. self wait. blockValue := mutuallyExcludedBlock value] in Semaphore>>critical:
BlockClosure>>ensure: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Semaphore>>critical: WAMutex>>critical: WAMutualExclusionFilter>>handleFiltered: [self filter handleFiltered: aRequestContext] in WASession(WARequestHandler)>>handle:
BlockClosure>>on:do: WACurrentRequestContext class(WADynamicVariable class)>>use:during: [WACurrentRequestContext use: self during: aBlock] in WARequestContext>>push:during:
BlockClosure>>ensure: WARequestContext>>push:during: WASession(WARequestHandler)>>handle:
WAApplication(WARegistry)>>dispatch:to: WAApplication(WARegistry)>>handleKeyed:with: WAApplication(WARegistry)>>handleFiltered:
WAApplication>>handleFiltered: WAExceptionFilter(WARequestFilter)>>handleFiltered: [super handleFiltered: aRequestContext] in WAExceptionFilter>>handleFiltered:
BlockClosure>>on:do: WAWalkbackErrorHandler(WAExceptionHandler)>>handleExceptionsDuring: WAWalkbackErrorHandler class(WAExceptionHandler class)>>handleExceptionsDuring:context:
WAExceptionFilter>>handleFiltered: [self filter handleFiltered: aRequestContext] in WAApplication(WARequestHandler)>>handle:
BlockClosure>>on:do: WACurrentRequestContext class(WADynamicVariable class)>>use:during: [WACurrentRequestContext use: self during: aBlock] in WARequestContext>>push:during:
BlockClosure>>ensure: WARequestContext>>push:during: WAApplication(WARequestHandler)>>handle:
WADispatcher>>handleFiltered:named: WADispatcher>>handleFiltered: [self filter handleFiltered: aRequestContext] in WADispatcher(WARequestHandler)>>handle:
BlockClosure>>on:do: WACurrentRequestContext class(WADynamicVariable class)>>use:during: [WACurrentRequestContext use: self during: aBlock] in WARequestContext>>push:during:
BlockClosure>>ensure: WARequestContext>>push:during: WADispatcher(WARequestHandler)>>handle:
[self requestHandler handle: aRequestContext] in ZnZincServerAdaptor(WAServerAdaptor)>>handleRequest: BlockClosure>>on:do: ZnZincServerAdaptor(WAServerAdaptor)>>handleRequest:
ZnZincServerAdaptor(WAServerAdaptor)>>handle: [self handle: context; responseFrom: context] in ZnZincServerAdaptor(WAServerAdaptor)>>process:
BlockClosure>>ensure: ZnZincServerAdaptor(WAServerAdaptor)>>process: ZnSeasideServerAdaptorDelegate>>handleRequest:
[self delegate ifNil: [ZnResponse notFound: request uri] ifNotNil: [:delegate | delegate handleRequest: request]] in ZnManagingMultiThreadedServer(ZnSingleThreadedServer)>>authenticateAndDelegateRequest:
ZnManagingMultiThreadedServer(ZnSingleThreadedServer)>>authenticateRequest:do: ZnManagingMultiThreadedServer(ZnSingleThreadedServer)>>authenticateAndDelegateRequest:
[self authenticateAndDelegateRequest: request] in ZnManagingMultiThreadedServer(ZnSingleThreadedServer)>>handleRequestProtected: BlockClosure>>on:do:
ZnManagingMultiThreadedServer(ZnSingleThreadedServer)>>handleRequestProtected: ZnManagingMultiThreadedServer(ZnSingleThreadedServer)>>handleRequest:
ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>executeOneRequestResponseOn: [[self executeOneRequestResponseOn: stream] whileFalse.
nil] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>executeRequestResponseLoopOn: [p psValueAt: index put: anObject.
aBlock value] in ZnCurrentServer(DynamicVariable)>>value:during: BlockClosure>>ensure: ZnCurrentServer(DynamicVariable)>>value:during:
ZnCurrentServer class(DynamicVariable class)>>value:during: ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>executeRequestResponseLoopOn:
[self executeRequestResponseLoopOn: stream] in [[self executeRequestResponseLoopOn: stream] ensure: [self log debug: 'Closing stream'.
self closeSocketStream: stream]] in [[[self executeRequestResponseLoopOn: stream] ensure: [self log debug: 'Closing stream'.
self closeSocketStream: stream]] ifCurtailed: [self log debug: 'Destroying socket'.
socket destroy]] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>serveConnectionsOn: BlockClosure>>ensure:
[[self executeRequestResponseLoopOn: stream] ensure: [self log debug: 'Closing stream'.
self closeSocketStream: stream]] in [[[self executeRequestResponseLoopOn: stream] ensure: [self log debug: 'Closing stream'.
self closeSocketStream: stream]] ifCurtailed: [self log debug: 'Destroying socket'.
socket destroy]] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>serveConnectionsOn: BlockClosure>>ifCurtailed:
[[[self executeRequestResponseLoopOn: stream] ensure: [self log debug: 'Closing stream'.
self closeSocketStream: stream]] ifCurtailed: [self log debug: 'Destroying socket'.
socket destroy]] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>serveConnectionsOn: [self value.
Processor terminateActive] in BlockClosure>>newProcess -------------------------------------------------------------------------------
Best jmdc _______________________________________________ seaside-dev mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/seaside-dev |
In reply to this post by Juan-2
Disregard my previous reply. By the time you
get to the code below, "html" is no longer usable (it was a canvas
for the original render).
On 6/12/13 4:04 PM, Juan wrote:
self call: (self renderContentTableOn: html)Depending on just what you want to accomplish, you could try something like: html submitButton callback: [ self call: (SomeOtherComponent new)]; value: 'Save' Cheers, Bob _______________________________________________ seaside-dev mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/seaside-dev |
Bob Great works like a charm, the only "caveats" was the render of the table is in another screen, no big deal , works. thanks a lot!
best mdc On Wed, Jun 12, 2013 at 5:22 PM, Bob Arning <[hidden email]> wrote:
_______________________________________________ seaside-dev mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/seaside-dev |
Free forum by Nabble | Edit this page |