Jump to content

Error Trapping


Arepo

Recommended Posts

Hello,

 

I am trying to get a global *error* function that resets the AutoCAD variables (clayer, cecolor, etc) to their original state when ESC or ENTER is hit. Originally I had written individual error code for every individual programs but I noticed that the error code run was for the last program loaded into the drawing and not the program I was running, so not all the variables I wanted were reset, depending of the last program loaded. So now I am trying to write a global error code. I am using Autoload function to load my programs, and I noticed that if I hit ESC the first time I'm using a program in a drawing, the variables are not reset (the error function is not run). After that, with variables manually reset, it works fine, the error code is run. I also noticed that if I use Load instead Autoload to load the program, it works fine, even the first time, but I don't want to use Load for all my programs. The question is: would it be a way to make error code run the first time I use a program loaded with Autoload function?

The second question I have: for a few programs I have a different error code (that deletes the last obj) that I don't want to be run for the rest of the programs. Is it possible to write a global code only for those few programs, and if yes, how to invoke it?

I hope I made clear what I am trying to say.

Thank you.

Edited by Arepo
Link to comment
Share on other sites

I've tried several different ways to account for *error* handling, and the simplest I've come across (to my mind), is to just localize the routine's *error* handler, so that it is only temporarily defined to handles any/all *error* raised, and when the routine is done, the default *error* handler is restored automagically.

 

Here's a quick example, storing, setting, and restoring the system variables you mentioned above... Again, this is only one of multiple ways of going about it:

 

(defun c:FOO (/ *error* clayer cecolor)

 (defun *error* (msg)
   (and clayer (setvar 'clayer clayer))
   (and cecolor (setvar 'cecolor cecolor))
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** ")))                  ; Fatal error, display it
   )
   (princ)
 )

 (if (and (setq clayer (getvar 'clayer))
          (setvar 'clayer "YourLayerName")
          (setq cecolor (getvar 'cecolor))
          (setvar 'cecolor "1")
     )
     ;;<-- do something useful
 )
 (*error* nil)
)

 

There's a lot to your post - I'll have to check back when I have more time for the other parts.

 

Cheers

Link to comment
Share on other sites

Arepo,

 

As Blackbox told you, there are numerous way to do it.

 

Here is the one I use by Evgenyi. You simply put in errl the sysvar you wish to re-establish upon completion.

 

ymg

 

(defun c:foo ( /  *acaddoc* *error* errl)     
    (vl-load-com)
    ;;; Error Handler by ElpanovEvgenyi                          ;     
    (defun *error* (msg)
(mapcar 'eval errl)
(if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")))
          (princ (strcat "\nError: " msg))
       )
(and *AcadDoc* (vla-endundomark *AcadDoc*))
       (princ)
    )
    
    (setq errl '("CLAYER" "OSMODE" "CMDECHO" "DIMZIN" "CECOLOR")
          errl (mapcar (function (lambda (a) (list 'setvar a (getvar a)))) errl)
    )     
    (or *AcadDoc*
       (setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object)))
    )

   ;;<-- do something useful
 
 (*error* nil)
)

Link to comment
Share on other sites

FWIW -

 

This line:

 

(and *AcadDoc* (vla-endundomark *AcadDoc*))

 

... Not that it really matters, but the call to EndUndoMark() Method will return Nil, which forces the AND statement to also return Nil, and can be confusing for some. While it yields the same outcome, given a valid *AcadDoc* Object, I tend to use an IF statement instead, if nothing, for the sake of 'readability'.

 

Cheers

Link to comment
Share on other sites

... Not that it really matters, but the call to EndUndoMark()

 

Make sense to me.

 

I like Evgenyi's method with eval because there is no need for variables declarations.

 

ymg

Link to comment
Share on other sites

I've used a template like this for years as a starting point for a robust routine :

 

[color=#8b4513];=======================================================================[/color]
[color=#8b4513];    New.Lsp                                    Jan 04, 2013[/color]
[color=#8b4513];    Edit Name And SubRoutine Prefix nw_ To Ensure Unique Definitions[/color]
[color=#8b4513];================== Start Program ======================================[/color]
[b][color=BLACK]([/color][/b]princ [color=#2f4f4f]"\nCopyright [b][color=FUCHSIA]([/color][/b]C[b][color=FUCHSIA])[/color][/b] 1990-2013, Fabricated Designs, Inc."[/color][b][color=BLACK])[/color][/b]
[b][color=BLACK]([/color][/b]princ [color=#2f4f4f]"\nLoading New v1.0 "[/color][b][color=BLACK])[/color][/b]
[b][color=BLACK]([/color][/b]setq nw_ nil lsp_file [color=#2f4f4f]"New"[/color][b][color=BLACK])[/color][/b]

[color=#8b4513];++++++++++++ Set Modes & Error ++++++++++++++++++++++++++++++++++[/color]
[b][color=BLACK]([/color][/b]defun nw_smd [b][color=FUCHSIA]([/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]SetUndo[b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]setq oldlay [b][color=NAVY]([/color][/b]getvar [color=#2f4f4f]"CLAYER"[/color][b][color=NAVY])[/color][/b]
      olderr *error*
     *error* [b][color=NAVY]([/color][/b]lambda [b][color=MAROON]([/color][/b]msg[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b]while [b][color=GREEN]([/color][/b]> [b][color=BLUE]([/color][/b]getvar [color=#2f4f4f]"CMDACTIVE"[/color][b][color=BLUE])[/color][/b] 0[b][color=GREEN])[/color][/b]
                      [b][color=GREEN]([/color][/b]command[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]/= msg [color=#2f4f4f]"quit / exit abort"[/color][b][color=GREEN])[/color][/b]
                    [b][color=GREEN]([/color][/b]princ [b][color=BLUE]([/color][/b]strcat [color=#2f4f4f]"\nError: *** "[/color] msg [color=#2f4f4f]" *** "[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]logand [b][color=RED]([/color][/b]getvar [color=#2f4f4f]"UNDOCTL"[/color][b][color=RED])[/color][/b] 8[b][color=BLUE])[/color][/b] 8[b][color=GREEN])[/color][/b]
                    [b][color=GREEN]([/color][/b]command [color=#2f4f4f]"_.UNDO"[/color] [color=#2f4f4f]"_END"[/color] [color=#2f4f4f]"_.U"[/color][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b]nw_rmd[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
      nw_var '[b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b][color=#2f4f4f]"CMDECHO"[/color]   . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"MENUECHO"[/color]   . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"MENUCTL"[/color]   . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"MACROTRACE"[/color] . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"OSMODE"[/color]    . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"SORTENTS"[/color]   . 119[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"LUPREC"[/color]    . 2[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"MODEMACRO"[/color] . [color=#2f4f4f]"."[/color][b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"BLIPMODE"[/color]  . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"EXPERT"[/color]     . 5[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"SNAPMODE"[/color]  . 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"PLINEWID"[/color]   . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"ORTHOMODE"[/color] . 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"GRIDMODE"[/color]   . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"ELEVATION"[/color] . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"THICKNESS"[/color]  . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"FILEDIA"[/color]   . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"FILLMODE"[/color]   . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"SPLFRAME"[/color]  . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"UNITMODE"[/color]   . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"TEXTEVAL"[/color]  . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"ATTDIA"[/color]     . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"AFLAGS"[/color]    . 0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"ATTREQ"[/color]     . 1[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"ATTMODE"[/color]   . 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"UCSICON"[/color]    . 1[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"HIGHLIGHT"[/color] . 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"REGENMODE"[/color]  . 1[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"COORDS"[/color]    . 2[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"DRAGMODE"[/color]   . 2[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"DIMZIN"[/color]    . 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"PDMODE"[/color]     . 0[b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"CECOLOR"[/color]   . [color=#2f4f4f]"BYLAYER"[/color][b][color=MAROON])[/color][/b]
               [b][color=MAROON]([/color][/b][color=#2f4f4f]"CELTYPE"[/color]   . [color=#2f4f4f]"BYLAYER"[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]foreach v nw_var
  [b][color=NAVY]([/color][/b]and [b][color=MAROON]([/color][/b]getvar [b][color=GREEN]([/color][/b]car v[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
       [b][color=MAROON]([/color][/b]setq nw_rst [b][color=GREEN]([/color][/b]cons [b][color=BLUE]([/color][/b]cons [b][color=RED]([/color][/b]car v[b][color=RED])[/color][/b] [b][color=RED]([/color][/b]getvar [b][color=PURPLE]([/color][/b]car v[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] nw_rst[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
       [b][color=MAROON]([/color][/b]setvar [b][color=GREEN]([/color][/b]car v[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]cdr v[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]princ [b][color=NAVY]([/color][/b]strcat [b][color=MAROON]([/color][/b]getvar [color=#2f4f4f]"PLATFORM"[/color][b][color=MAROON])[/color][/b] [color=#2f4f4f]" Release "[/color] [b][color=MAROON]([/color][/b]ver[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

[color=#8b4513];++++++++++++ Return Modes & Error +++++++++++++++++++++++++++++++[/color]
[b][color=BLACK]([/color][/b]defun nw_rmd [b][color=FUCHSIA]([/color][/b][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]SetLayer oldlay[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]setq *error* olderr[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]foreach v nw_rst [b][color=NAVY]([/color][/b]setvar [b][color=MAROON]([/color][/b]car v[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]cdr v[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.UNDO"[/color] [color=#2f4f4f]"_END"[/color][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

[color=#8b4513];++++++++++++ Set And Start An Undo Group ++++++++++++++++++++++++[/color]
[b][color=BLACK]([/color][/b]defun SetUndo [b][color=FUCHSIA]([/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]zerop [b][color=MAROON]([/color][/b]getvar [color=#2f4f4f]"UNDOCTL"[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
     [b][color=NAVY]([/color][/b]command [color=#2f4f4f]"_.UNDO"[/color] [color=#2f4f4f]"_ALL"[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]= [b][color=MAROON]([/color][/b]logand [b][color=GREEN]([/color][/b]getvar [color=#2f4f4f]"UNDOCTL"[/color][b][color=GREEN])[/color][/b] 2[b][color=MAROON])[/color][/b] 2[b][color=NAVY])[/color][/b]
     [b][color=NAVY]([/color][/b]command [color=#2f4f4f]"_.UNDO"[/color] [color=#2f4f4f]"_CONTROL"[/color] [color=#2f4f4f]"_ALL"[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]= [b][color=MAROON]([/color][/b]logand [b][color=GREEN]([/color][/b]getvar [color=#2f4f4f]"UNDOCTL"[/color][b][color=GREEN])[/color][/b] 8[b][color=MAROON])[/color][/b] 8[b][color=NAVY])[/color][/b]
     [b][color=NAVY]([/color][/b]command [color=#2f4f4f]"_.UNDO"[/color] [color=#2f4f4f]"_END"[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.UNDO"[/color] [color=#2f4f4f]"_GROUP"[/color][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

[color=#8b4513];++++++++++++ Make Layer Current +++++++++++++++++++++++++++++++++[/color]
[b][color=BLACK]([/color][/b]defun SetLayer [b][color=FUCHSIA]([/color][/b]name / ldef flag[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]cond [b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b]or [b][color=GREEN]([/color][/b]not name[b][color=GREEN])[/color][/b]
            [b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]snvalid name[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\nBad Aurgment Passed To SetLayer - "[/color][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]prin1 name[b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]exit[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
       [b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b]not [b][color=GREEN]([/color][/b]tblsearch [color=#2f4f4f]"LAYER"[/color] name[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]command [color=#2f4f4f]"_.LAYER"[/color] [color=#2f4f4f]"_Make"[/color] name [color=#2f4f4f]""[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
       [b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b]setq ldef [b][color=GREEN]([/color][/b]tblsearch [color=#2f4f4f]"LAYER"[/color] name[b][color=GREEN])[/color][/b]
              flag [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc 70 ldef[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]command [color=#2f4f4f]"_.LAYER"[/color][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]minusp [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 62 ldef[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
             [b][color=GREEN]([/color][/b]command [color=#2f4f4f]"_On"[/color] name[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]logand flag  1[b][color=BLUE])[/color][/b]  1[b][color=GREEN])[/color][/b]
             [b][color=GREEN]([/color][/b]command [color=#2f4f4f]"_Thaw"[/color] name[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]logand flag  4[b][color=BLUE])[/color][/b]  4[b][color=GREEN])[/color][/b]
             [b][color=GREEN]([/color][/b]command [color=#2f4f4f]"_Unlock"[/color] name[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]logand flag 16[b][color=BLUE])[/color][/b] 16[b][color=GREEN])[/color][/b]
             [b][color=GREEN]([/color][/b]alert [color=#2f4f4f]"\nCannot Set To XRef Dependent Layer - Aborting"[/color][b][color=GREEN])[/color][/b]
             [b][color=GREEN]([/color][/b]quit[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
        [b][color=MAROON]([/color][/b]command [color=#2f4f4f]"_Set"[/color] name [color=#2f4f4f]""[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
name[b][color=BLACK])[/color][/b]

[color=#8b4513];************ Main Program ***************************************[/color]
[b][color=BLACK]([/color][/b]defun nw_ [b][color=FUCHSIA]([/color][/b]/ olderr oldlay nw_var nw_rst[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]nw_smd[b][color=FUCHSIA])[/color][/b]

[color=#8b4513];;;MAIN CODE HERE[/color]

 [b][color=FUCHSIA]([/color][/b]nw_rmd[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

[color=#8b4513];************ Load Program ***************************************[/color]
[b][color=BLACK]([/color][/b]defun C:New [b][color=FUCHSIA]([/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]nw_[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]
[b][color=BLACK]([/color][/b]if nw_ [b][color=FUCHSIA]([/color][/b]princ [color=#2f4f4f]"\nNew Loaded\n"[/color][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]
[b][color=BLACK]([/color][/b]prin1[b][color=BLACK])[/color][/b]
[color=#8b4513];|================== End Program =======================================[/color]

-David.

Link to comment
Share on other sites

Thank you everybody for help. I got a few ideas, and it looks like it's working so far.

BlackBox: can the default error handler you mentioned be accessed and edited in some way?

Link to comment
Share on other sites

BlackBox: can the default error handler you mentioned be accessed and edited in some way?

 

That is not advised... The reason for temporarily redefining the default *error* handler, is to perform custom actions in the event of an error in your routine. If the default *error* handler is not properly restored, this will cause other errors to potentially not be handled properly, which can ultimately lead to a fatal error (crash).

 

For this reason, I choose to localize my routine's *error* function, as when the routine ends, it is no longer defined (i.e., removed from scope).

 

I hope that makes (more?) sense.

 

Cheers

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...