Multi-day accumulated fixes: tag dispatch, session/pooling correctness, SPA rollout, jetc compiler

JetCore engine (Tag.cpp/.h, Global.cpp/.h, __*.cpp tag classes):
- Numerous __mysql.cpp connection-pooling correctness fixes (stale
  result sets, double-indirection sessionid bugs, field caching,
  pool keying) and a session-registration-before-connection-confirmed
  ordering fix (dangling pointer on a failed connect)
- Tag.cpp: large body of fixes to the tag-dispatch/container-scanning
  logic (bare-name fallback, database aliasing, single-quote handling,
  @-prefix session variable resolution, TAGDEF caching, nested split-tag
  scanning for if/while/until/ifrow so an inner one doesn't corrupt an
  outer one's own boundary scan) plus the process-first rendering
  order fix (a <process> now runs before <checksession>/page
  resolution, fixing a real "blank page after successful login" bug)
- Global.h/.cpp: added imapSessions (parallel to the existing __mysql*
  session map) for the new <imap> tag family
- __whiledir.cpp/__include.cpp: caching and directory-name-aliasing
  fixes
- __call.cpp/.h: fixed a dangling-pointer bug
- __write.cpp: fixed an O_WRONLY-only open that couldn't create a new
  file
- __ifrow.cpp/__sql.cpp: fixed the same sessionid double-indirection
  bug __mysql.cpp had (resolveKeyword's result was being used as a map
  key lookup instead of the resolved value itself)

jetc compiler (jetc/JetParser.cpp/.h, JetCodegen.cpp/.h, JetAST.h,
jetc.cpp, build-shared.sh, build-compiled.sh):
- Parser fixes: inline <include>, nested-quote handling, void-tag
  recognition
- Codegen fixes and expanded AST support
- build-shared.sh: atomic rename into place for a freshly-built .jtc
  (a live server dlopen()ing the same path mid-rebuild was corrupting
  its own already-mapped view of the old file) and a staleness check
  so a cached JetCore .o doesn't silently keep serving yesterday's
  fixes forever
- Added -lssl to both build scripts' link lines (needed once the new
  <imap> tag's client-side TLS code existed - previously nothing in
  this codebase used OpenSSL's SSL/TLS client API, only libcrypto)

Site content (jetc/barant-site/): SPA (fetch-and-swap navigation)
rollout across essentially every .page/.jet/.section/.tag/.proc/.method
file - dynamic-content fixes, fragment-mode stripping, native
$[@name] session variables replacing older mechanisms, and this
session's own checkout.page redesign, login start-param redirect fix,
and per-page side-menu (menu.bar/$[PAGE].menu) refresh support.
Completed the earlier main.css/control.css move from assets/ to
assets/images/ (git still showed the old paths as tracked-but-deleted
until now).

Deliberately left out of this commit: dozens of .pre-<description>-
<date> manual backup files (this session's and earlier ones' own
before/after snapshots, not meant for permanent history), compiled
.jtc build outputs, ad hoc test binaries and scripts under jetc/
(login_asan, wcwc_test, optest2_bin, etc.), and jetc/__pycache__/ -
none of these are meant to be tracked; a .gitignore covering them
would be worth adding separately.
This commit is contained in:
Brad Arant committed 2026-09-03 05:20:48 +00:00
1 parent 54b6e522f9
commit b0cadc3f08
161 files changed
+3440 -2760

No files matched your search

+22
View File
@@ -1,8 +1,10 @@
#include "Global.h"
#include "Exception.h"
#include "__mysql.h"
#include "__imap.h"
#include <iostream>
#include <stdlib.h>
#include <cstdio>
namespace jet {
@@ -44,6 +46,26 @@ namespace jet {
return sessions[sessionId];
}
bool Global::imapSessionExists(coreutils::MString sessionId) {
return imapSessions.find(sessionId) != imapSessions.end();
}
void Global::addImapSession(coreutils::MString sessionId, __imap *imap) {
if(imapSessionExists(sessionId))
throw coreutils::Exception("imap sessionid already exists.");
imapSessions[sessionId] = imap;
}
void Global::removeImapSession(coreutils::MString sessionId) {
imapSessions.erase(sessionId);
}
__imap * Global::getImapSession(coreutils::MString sessionId) {
if(imapSessions.find(sessionId) == imapSessions.end())
throw coreutils::Exception("requested imap session is not available.");
return imapSessions[sessionId];
}
coreutils::ZString Global::getSessionVariable(coreutils::MString &splitName) {
if(sessions.find(splitName[0]) == sessions.end())
throw coreutils::Exception("requested session is not available in variable.");
+28
View File
@@ -11,6 +11,8 @@
namespace jet {
class __mysql;
class __imap;
class Tag;
class Global {
@@ -23,6 +25,10 @@ namespace jet {
void addSession(coreutils::MString sessionId, __mysql *mysql);
void removeSession(coreutils::MString sessionId);
__mysql * getSession(coreutils::MString sessionId);
bool imapSessionExists(coreutils::MString sessionId);
void addImapSession(coreutils::MString sessionId, __imap *imap);
void removeImapSession(coreutils::MString sessionId);
__imap * getImapSession(coreutils::MString sessionId);
coreutils::ZString getSessionVariable(coreutils::MString &splitName);
void outputHeaders();
void setupFormData(coreutils::ZString &formdata);
@@ -55,11 +61,33 @@ namespace jet {
std::map<coreutils::MString, __mysql *> sessions;
std::map<coreutils::MString, coreutils::MString> headers;
std::map<coreutils::MString, coreutils::MString> tags;
// Populated once per compiled .jtc module's own entry function (see
// jetc's TAGDEF codegen) - a top-level <tag name="X"> definition
// that jetc could compile directly registers its own render
// function here under its lowercase name, same key convention as
// `tags` above. __dotag checks this first before falling back to
// the text-based findTagDefinition()/processContainer() path (see
// __dotag.cpp), avoiding a full re-parse of the definition's body
// on every invocation. A miss here (a locally-scoped/nested tag
// definition, or content that was never compiled at all) is always
// safe - it just means the existing interpreted path runs exactly
// as it always has; this is a pure additive fast path, never a
// replacement for `tags`, which every TAGDEF still populates too.
std::map<coreutils::MString, void(*)(Tag&, coreutils::MString&)> compiledTags;
char **envp;
bool cgi = false;
bool session = false;
coreutils::MString sessionId;
// Deliberately the LAST member declared in Global - appended
// here, after every pre-existing field, rather than inserted
// earlier among them, so this addition does not shift the
// memory offset of any field that existed before it. See
// __imap.h for what registers here.
std::map<coreutils::MString, __imap *> imapSessions;
};
}
+200 -2
View File
@@ -6,6 +6,8 @@
#include <time.h>
#include <chrono>
#include <cmath>
#include <vector>
#include <random>
namespace jet {
@@ -27,8 +29,73 @@ namespace jet {
string = op.string;
doubleValue = op.doubleValue;
isNumber = op.isNumber;
// A parenthesized sub-expression's own comparison result was never
// propagated to the wrapping Operand - only string/doubleValue/
// isNumber were copied, leaving this Operand's own `boolean`
// genuinely uninitialized (Operand.h declares it with no default
// value). Confirmed via debug tracing: printed as garbage stack
// bytes, which "and"/"or" then combined instead of the real
// true/false result.
boolean = op.boolean;
if(!in.ifNext(")"))
throw coreutils::Exception("expected ) in expression.");
} else if(in.ifNextIgnoreCase("SUBSTRING_INDEX")) {
// MySQL SUBSTRING_INDEX(str, delim, count): with a positive count,
// returns everything before the count-th occurrence of delim
// (counting from the left); with a negative count, everything
// after the |count|-th occurrence (counting from the right). If
// delim doesn't occur that many times, the whole string is
// returned unchanged. Genuinely missing (like LOCATE was) - real
// content (index2.cgi's own URI-parsing logic, ported as part of
// the /var/www/barant jet-2.0 conversion) relies on it to peel a
// path apart one segment at a time:
// substring_index(substring_index('$[REQUEST_URI]','?',1),'/',2).
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for SUBSTRING_INDEX parameters.");
Operand parm1(in, tag);
if(!in.ifNext(","))
throw coreutils::Exception("Expecting , in SUBSTRING_INDEX expression.");
Operand parm2(in, tag);
if(!in.ifNext(","))
throw coreutils::Exception("Expecting , in SUBSTRING_INDEX expression.");
Operand parm3(in, tag);
if(in.ifNext(")")) {
coreutils::MString haystack = parm1.string;
haystack.reset();
coreutils::MString delim = parm2.string;
delim.reset();
int count = parm3.string.asInteger();
int delimLen = (int)delim.getLength();
std::vector<int> positions;
if(delimLen > 0) {
int base = 0;
while(true) {
coreutils::MString scan = haystack.substring(base);
scan.reset();
int pos = scan.find(delim);
if(pos == -1) break;
positions.push_back(base + pos);
base += pos + delimLen;
}
}
if(count >= 0) {
size_t n = (size_t)count;
if(n == 0 || positions.size() < n) {
string = haystack.substring(0);
} else {
string = haystack.substring(0, positions[n - 1]);
}
} else {
size_t n = (size_t)(-count);
if(positions.size() < n) {
string = haystack.substring(0);
} else {
int idx = positions[positions.size() - n];
string = haystack.substring(idx + delimLen);
}
}
} else
throw coreutils::Exception("Expecting ) at end of SUBSTRING_INDEX expression.");
} else if(in.ifNextIgnoreCase("SUBSTRING")) {
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for SUBSTRING parameters.");
@@ -58,6 +125,58 @@ namespace jet {
} else
throw coreutils::Exception("Expecting ) at end of substring expression.");
}
} else if(in.ifNextIgnoreCase("LOCATE")) {
// MySQL-style LOCATE(needle, haystack): 1-based position of the
// first occurrence of needle within haystack, or 0 if not found -
// a genuinely missing function (like <eval> was a genuinely
// missing tag). Real 1.4 content depends on it for exactly this
// "is #[name] present in the space-padded $[errfield] list"
// pattern (barant.tag's own <field> definition:
// locate(' #[name] ','$[errfield]') != 0), used throughout for
// marking a field's input as erroring after a failed validation.
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for LOCATE parameters.");
Operand parm1(in, tag);
if(!in.ifNext(","))
throw coreutils::Exception("Expecting , in LOCATE expression.");
Operand parm2(in, tag);
if(in.ifNext(")")) {
coreutils::MString haystack = parm2.string;
haystack.reset();
int pos = haystack.find(parm1.string);
doubleValue = (pos == -1) ? 0 : (pos + 1);
isNumber = true;
string = std::format("{:.12f}", doubleValue);
string.removeTrailingZeros();
} else {
// Optional 3rd start_pos argument (MySQL LOCATE(substr, str,
// pos)): search begins at the given 1-based position instead of
// the start of the string. Needed by index2.cgi's own real
// URI-parsing logic (walking a path one '/' at a time), ported
// as part of the /var/www/barant jet-2.0 conversion.
if(!in.ifNext(","))
throw coreutils::Exception("Expecting , in LOCATE expression.");
Operand parm3(in, tag);
if(in.ifNext(")")) {
coreutils::MString haystack = parm2.string;
haystack.reset();
int totalLen = (int)haystack.getLength();
int startPos = parm3.string.asInteger() - 1;
if(startPos < 0) startPos = 0;
if(startPos >= totalLen) {
doubleValue = 0;
} else {
coreutils::MString sub = haystack.substring(startPos);
sub.reset();
int pos = sub.find(parm1.string);
doubleValue = (pos == -1) ? 0 : (startPos + pos + 1);
}
isNumber = true;
string = std::format("{:.12f}", doubleValue);
string.removeTrailingZeros();
} else
throw coreutils::Exception("Expecting ) at end of LOCATE expression.");
}
} else if(in.ifNextIgnoreCase("LEFT")) {
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for LEFT parameters.");
@@ -384,7 +503,10 @@ namespace jet {
string.removeTrailingZeros();
} else
throw coreutils::Exception("Expecting ) at end of FLOOR expression.");
} else if(in.ifNextIgnoreCase("UNIXTIME")) {
} else if(in.ifNextIgnoreCase("UNIXTIME") || in.ifNextIgnoreCase("UNIX_TIMESTAMP")) {
// Real content (cart.page's own <set expr="unix_timestamp()">)
// calls MySQL's real function name, not this codebase's own
// "UNIXTIME" - same value, just accept both spellings.
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for UNIXTIME.");
if(in.ifNext(")")) {
@@ -396,6 +518,59 @@ namespace jet {
} else
throw coreutils::Exception("Expecting ) at end of UNIXTIME.");
}
else if(in.ifNextIgnoreCase("NOW")) {
// MySQL's now() - real content (SESSIONCTL.tag's own
// createsession definition: <set name="_timestamp" expr="now()">,
// embedded directly into a DATETIME column via a raw SQL literal:
// timestamp='$[_timestamp]') expects a MySQL DATETIME-formatted
// string ("YYYY-MM-DD HH:MM:SS"), not a Unix timestamp (that's
// UNIX_TIMESTAMP, just above).
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for NOW.");
if(in.ifNext(")")) {
std::time_t t = std::time(nullptr);
std::tm tmVal;
gmtime_r(&t, &tmVal);
char buf[32];
std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tmVal);
string = buf;
isNumber = false;
} else
throw coreutils::Exception("Expecting ) at end of NOW.");
}
else if(in.ifNextIgnoreCase("UUID")) {
// MySQL's uuid() - real content (SESSIONCTL.tag's own
// createsession definition: <set name="_uuid" expr="uuid()">)
// uses this to mint a new session id, stored as sessions.uuid and
// handed back to the browser as the _session_id cookie. A real
// random (v4) UUID, not MySQL's actual v1 (time+MAC-derived)
// algorithm - the schema only ever treats this as an opaque
// unique string, nothing depends on v1's specific bit layout.
// Seeded from std::random_device (real entropy), not RANDOM's
// existing clock()-seeded rand_r() above - this value doubles as
// a session token, so it needs to be unguessable, not just unique.
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for UUID.");
if(in.ifNext(")")) {
static thread_local std::mt19937_64 rng(std::random_device{}());
std::uniform_int_distribution<int> hexDigit(0, 15);
const char *hex = "0123456789abcdef";
char buf[37];
int p = 0;
for(int i = 0; i < 36; i++) {
if(i == 8 || i == 13 || i == 18 || i == 23) { buf[p++] = '-'; continue; }
int v;
if(i == 14) v = 4; // version 4
else if(i == 19) v = 8 + hexDigit(rng) % 4; // variant 10xx
else v = hexDigit(rng);
buf[p++] = hex[v];
}
buf[p] = '\0';
string = buf;
isNumber = false;
} else
throw coreutils::Exception("Expecting ) at end of UUID.");
}
else if(in.ifNextIgnoreCase("DATEDIFF")) {
if(!in.ifNext("("))
throw coreutils::Exception("Expecting ( for DATEDIFF.");
@@ -437,8 +612,19 @@ namespace jet {
string = std::format("{:.12f}", doubleValue);
isNumber = true;
} else if(in.ifNext("'")) {
string = in.getTokenExclude("'");
coreutils::MString raw = in.getTokenExclude("'");
in.ifNext("'");
coreutils::MString resolved;
raw.reset();
while(!raw.eod()) {
if(raw.startsWith("$[") || raw.startsWith("#["))
resolved.write(tag.getVariable(raw));
else {
resolved.write(raw.charAt(0));
raw.nextChar();
}
}
string = resolved;
isNumber = false;
} else
throw coreutils::Exception("operand is not valid.");
@@ -646,6 +832,18 @@ namespace jet {
} else
throw coreutils::Exception("operand is not a number.");
}
in.skipWhitespace();
if(in.ifNextIgnoreCase("and")) {
Operand op(in, tag);
boolean = boolean && op.boolean;
isNumber = false;
string = boolean ? "true" : "false";
} else if(in.ifNextIgnoreCase("or")) {
Operand op(in, tag);
boolean = boolean || op.boolean;
isNumber = false;
string = boolean ? "true" : "false";
}
return true;
}
+692 -42
View File
@@ -1,10 +1,20 @@
#include "Tag.h"
#include <set>
#include <utility>
#include <unordered_map>
#include "Exception.h"
#include "Global.h"
#include "__mysql.h"
#include "__sql.h"
#include "__imap.h"
#include "__imaplist.h"
#include "__imapmessage.h"
#include "__imapflag.h"
#include "__imapdelete.h"
#include "__whilerow.h"
#include "__comment.h"
#include "__eval.h"
#include <cstdio>
#include "__exclude.h"
#include "__for.h"
#include "__if.h"
@@ -50,7 +60,66 @@ namespace jet {
while(!finished) {
in.skipWhitespace();
if(in.ifNext(">")) {
hasContainer = true;
// jet-1.4's real parser knew which built-ins never take
// a body (its own "void element" list) - real 1.4
// content (SESSIONCTL.tag, config.cfg, index.cgi) is
// written with a bare closing '>' and no explicit
// </tag> for these, which a plain "bare '>' always means
// scan for a body" rule can't tell apart from a real
// container tag that happens to be immediately followed
// by more content. Kept in sync with jetc's own
// JetParser.cpp::isVoidTag - same list, same reasoning,
// this is the runtime-interpreted-fallback-path
// equivalent of that compile-time fix.
coreutils::MString nameLower = coreutils::MString(name).toLower();
// exclude was wrongly listed here - __exclude.cpp's own
// constructor explicitly throws "exclude must have a
// container" if hasContainer is false, so it always
// needs a real body (e.g. mainpagetemplate.temp's own
// <exclude><title></exclude>) - it was never actually
// void, this was a miscategorization.
bool isVoid = (nameLower == "set") || (nameLower == "include") ||
(nameLower == "cookie") || (nameLower == "header") ||
(nameLower == "read") || (nameLower == "write") ||
(nameLower == "call") || (nameLower == "system") ||
(nameLower == "dump");
// A CUSTOM tag (not one of jet's own built-ins above)
// written bare, with no explicit close, is genuinely
// ambiguous: is a real body coming (scan for
// </thisname>), or is this self-closing and whatever
// follows is unrelated sibling content? Real 1.4
// content writes multiple bare invocations of the SAME
// custom tag back-to-back with no close at all
// (login.page's own two <field .../> entries, no
// </field> anywhere) - scanning for a body in that case
// doesn't just fail to find one, it finds the NEXT
// sibling invocation of the same tag name via ifNested
// (which recognizes it as "another <field>", recurses
// into IT looking for ITS OWN close, and so on) and
// silently swallows everything through EOF as this
// tag's own unused body - since a tag whose own
// definition never references <container> never reads
// that captured text anyway, the result is silent,
// undetectable content loss, confirmed live: the second
// <field>, <buttonbay>, and the login button all
// vanished from real rendered output with zero errors.
// Resolve the ambiguity the same way the built-in list
// above already does: if this tag's own DEFINITION
// never references a bare <container> (so it could
// never use captured body text even if it had one),
// treat it as void too - genuinely no way to lose
// content that would never have been read regardless.
if(!isVoid) {
coreutils::ZString customDef;
if(findTagDefinition(name, customDef)) {
coreutils::MString defLower(customDef);
defLower.reset();
defLower = defLower.toLower();
defLower.reset();
isVoid = (defLower.find(coreutils::MString("<container")) == -1);
}
}
hasContainer = !isVoid;
hasContainer2 = false;
finished = true;
break;
@@ -61,14 +130,52 @@ namespace jet {
break;
}
if(!finished) {
coreutils::ZString keywordName = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
if(in.ifNext("=\"")) {
// Every keyword lookup site in this codebase (keywordDefined("name"),
// resolveKeyword("host"), etc.) uses a lowercase literal - real
// 1.4 content writes attribute NAMES in any case too (e.g.
// SESSIONCTL.tag's <TAG NAME="ABUTTON" ...>), so the key has to
// be normalized to lowercase here, at the point of storage, or
// every lookup against it silently misses (keywordDefined("name")
// doesn't find "NAME") rather than erroring clearly.
coreutils::MString keywordName = coreutils::MString(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")).toLower();
// Real 1.4 content quotes attribute values with either " or '
// (SESSIONCTL.tag's own <tag name='sessionctl' keywords="page
// stylesheet"> uses both in the same tag) - accept either,
// closing with whichever character opened it.
bool dq = in.ifNext("=\"");
bool sq = !dq && in.ifNext("='");
if(dq || sq) {
if(keywords.count(keywordName) == 0)
keywords[keywordName] = in.getTokenExclude("\"");
keywords[keywordName] = in.getTokenExclude(dq ? "\"" : "'");
else
throw coreutils::Exception("keyword name must be unique for tag.");
in.ifNext(dq ? "\"" : "'");
} else if(keywordName.getLength() > 0) {
// Unquoted attribute value (e.g. TYPE=NE, SCOPE=LOCAL - real
// 1.4 content throughout). Neither quote style matched, but
// getTokenInclude() above already consumed the attribute NAME
// and left the cursor sitting exactly on '=' - without also
// consuming '=' and the unquoted value here, the next
// iteration's getTokenInclude() call returns empty (cursor is
// still at '=', not a name character) and this loops forever
// with zero forward progress. Same bug class already found and
// fixed in ifNested()'s own copy of this logic - this is
// Tag::Tag's main constructor's separate, parallel copy.
if(in.ifNext("=")) {
coreutils::MString value;
while(!in.eod()) {
char c = in.charAt(0);
if(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '>' || c == '/')
break;
value.write(c);
in.nextChar();
}
if(keywords.count(keywordName) == 0)
keywords[keywordName] = value;
else
throw coreutils::Exception("keyword name must be unique for tag.");
}
if(!in.ifNext("\"")) {}
}
}
}
if(keywordDefined("filterblanklines")) {
@@ -105,7 +212,7 @@ namespace jet {
// from splitTagName itself so it works for any split tag.
coreutils::MString splitOpenTag;
splitOpenTag << "<" << splitTagName << ">";
in.ifNext(splitOpenTag);
in.ifNextIgnoreCase(splitOpenTag);
start = in.getCursor();
} else if(ifNested(in)) {
} else
@@ -134,7 +241,53 @@ namespace jet {
copyContainer(container, parentOut);
}
// Tracks (scope, keyword-name) pairs whose resolution is currently
// in progress, shared between resolveKeyword (populates it around its
// own body) and getVariable's #[...] parent-chain walk (consults it).
// Real content passes a keyword straight through under the SAME name
// to a nested invocation that also declares a keyword by that name -
// e.g. barant.tag's own <linkbutton page="#[page]" ...> (linkbutton
// itself declares "page" as one of its own keywords too, coincidentally
// the same name as the enclosing tag's own "page" being forwarded).
// #[page] here means "my CALLER's page value", but by the time it's
// lazily resolved (raw text is stored unresolved at attribute-parse
// time, only interpreted later when actually read), there's no record
// of which scope originally wrote it - a naive parent-chain walk
// restarts from `local` every time and immediately re-finds THIS SAME
// tag's own "page" keyword (the one currently being resolved) instead
// of continuing outward to the real caller, recursing forever. Once a
// (scope, name) pair is already being resolved, the walk below skips
// that scope for that name and continues to scope->parent instead of
// recursing back into it.
static thread_local std::set<std::pair<Tag*, coreutils::MString>> resolvingKeywords;
coreutils::MString Tag::resolveKeyword(coreutils::ZString keyword) {
// Defensive recursion guard, kept as a backstop for any OTHER
// self-referential chain the (scope, keyword) tracking above
// doesn't happen to cover (e.g. a longer, indirect cycle through
// several different keyword names) - crashing the whole process
// via stack overflow is never acceptable, even for a case not
// specifically identified yet.
static thread_local int resolveDepth = 0;
if(resolveDepth > 100)
throw coreutils::Exception("keyword resolution recursion limit exceeded - likely a self-referential #[name]/$[name] value.");
struct DepthGuard {
int &d;
DepthGuard(int &d) : d(d) { ++d; }
~DepthGuard() { --d; }
} depthGuard(resolveDepth);
coreutils::MString keywordNameCopy(keyword);
std::pair<Tag*, coreutils::MString> resolvingKey(this, keywordNameCopy);
bool alreadyTracked = resolvingKeywords.count(resolvingKey) > 0;
if(!alreadyTracked)
resolvingKeywords.insert(resolvingKey);
struct ResolvingGuard {
std::set<std::pair<Tag*, coreutils::MString>> &s;
std::pair<Tag*, coreutils::MString> k;
bool owns;
ResolvingGuard(std::set<std::pair<Tag*, coreutils::MString>> &s, std::pair<Tag*, coreutils::MString> k, bool owns) : s(s), k(k), owns(owns) {}
~ResolvingGuard() { if(owns) s.erase(k); }
} resolvingGuard(resolvingKeywords, resolvingKey, !alreadyTracked);
coreutils::MString resolved;
keywords[keyword].reset();
while(!keywords[keyword].eod()) {
@@ -154,8 +307,123 @@ namespace jet {
parseContainer(container, out, container2, topLevel);
}
// Extracted, unchanged, from parseContainer's own "container" dispatch
// branch below - see that branch's original comment (preserved there)
// and Tag.h's own doc comment for the full explanation of the
// scope-walk/recursion-guard behavior this preserves exactly. The
// hasContainer/evaluate gate matches processContainer's own gate
// (both call sites this replaced went through processContainer,
// which silently no-ops unless both are true) - collapsed to one
// check here since it's the same guard either branch below would
// have applied individually.
void Tag::renderContainer(coreutils::MString &out, coreutils::ZString container2) {
if(!(hasContainer && evaluate))
return;
static thread_local std::set<Tag*> resolvingContainerScopes;
Tag *containerScope = local;
while(containerScope &&
(!containerScope->isCustomTagBoundary ||
resolvingContainerScopes.count(containerScope) > 0))
containerScope = containerScope->parent;
if(containerScope != NULL) {
resolvingContainerScopes.insert(containerScope);
try {
// ZString tracks its own read cursor (see ZString.h's own
// reset() doc comment) - containerScope->container is a
// persistent member reused across EVERY <container> reference
// within the same custom tag invocation, not a fresh value per
// call. Without resetting it first, a SECOND <container>
// reference in one invocation (e.g. SESSIONCTL.tag's own
// setenv definition: <eval name="_envvalue" scope="local">
// <container></eval> followed later by
// <eval name="#[name]"><container></eval>) parses an
// already-exhausted cursor and silently renders empty, even
// though the first reference worked correctly - confirmed via
// a real repro: setenv's own second <container> use wrote ""
// instead of the caller's actual value, so every
// $[_login_id]-style read after a successful login stayed
// empty. resolveKeyword() already resets its own equivalent
// cursor (keywords[keyword]) both before and after for the
// same reason - this mirrors that.
containerScope->container.reset();
parseContainer(containerScope->container, out, NULL, false);
} catch(...) {
resolvingContainerScopes.erase(containerScope);
throw;
}
resolvingContainerScopes.erase(containerScope);
} else {
container2.reset();
parseContainer(container2, out, NULL, false);
}
}
namespace {
struct CachedTagDef {
coreutils::MString name;
coreutils::MString body;
};
// Recognizes the exact pattern jetc's own codegen emits for every
// top-level <tag name="X">...</tag> definition it doesn't itself
// specially compile (everything except set/if/for/while - see
// JetCodegen.cpp): one interpretSpan(span, out) call per
// definition, re-run from scratch on every single request even
// though the definition text (SESSIONCTL.tag/barant.tag/
// project.tag, spliced in at compile time via <include>) never
// changes between requests once compiled - confirmed live, a real
// page's compiled main.compiled.cpp calls this 15+ times per
// request, one of them (the whole <tag name='sessionctl'> block,
// every nested tag definition inside it included) close to 5000
// characters, all fully re-scanned through the generic runtime Tag
// dispatch every time. Keyed by the span's own raw data pointer,
// not its content - safe because jetc emits these spans as C
// string literals (static storage duration, the same address for
// the whole life of the process), so pointer identity alone means
// "the exact same compiled span, already seen once on this
// thread" with no need to hash or compare bytes.
thread_local std::unordered_map<const char*, CachedTagDef> tagDefCache;
}
void Tag::interpretSpan(coreutils::ZString span, coreutils::MString &out) {
const char *key = span.getData();
auto cached = tagDefCache.find(key);
if(cached != tagDefCache.end()) {
global.tags[cached->second.name] = cached->second.body;
return;
}
// Only the fast path above is new behavior - everything below
// this point, for a cache MISS, is the exact same real interpreter
// call as before. The snapshot/diff afterward is purely for
// deciding whether THIS span is safe to cache for next time - it
// never changes what actually happens on this (first, per-thread)
// call.
std::set<coreutils::MString> tagKeysBefore;
for(auto &entry : global.tags)
tagKeysBefore.insert(entry.first);
size_t outLenBefore = out.getLength();
parseContainer(span, out);
// Only cache spans whose entire observable effect was registering
// EXACTLY one new top-level tag definition, with nothing written
// to `out` - the precise signature of a bare <tag name="X">...
// </tag> definition block (evaluate=false/output=false in
// __tag.cpp - see its own doc comment). Real page content,
// multiple registrations in one span, or a registration that
// landed in some scope's own localTags instead of global.tags
// (nested inside another custom tag, not the top-level case this
// targets) are all left running the real interpreter every time -
// the safe default, never caching something that isn't provably
// pure and static.
if(out.getLength() == outLenBefore && global.tags.size() == tagKeysBefore.size() + 1) {
for(auto &entry : global.tags) {
if(tagKeysBefore.find(entry.first) == tagKeysBefore.end()) {
tagDefCache[key] = CachedTagDef{entry.first, entry.second};
break;
}
}
}
}
void Tag::parseContainer(coreutils::ZString &in, coreutils::MString &out, coreutils::ZString container2, bool topLevel) {
@@ -175,7 +443,12 @@ namespace jet {
out.write("<|");
continue;
} else if(in.startsWith("<")) {
if(ifTagName(in, "mysql")) {
if(ifTagName(in, "mysql") || ifTagName(in, "database")) {
// <database> is jet-1.4's name for this same tag (real 1.4
// content - SESSIONCTL.tag's own <sessionctl> definition,
// index.cgi itself - uses <database name="..."> throughout,
// never <mysql>) - recognized as a real alias rather than
// requiring that content to be rewritten.
__mysql _mysql(in, out, global, this, local);
continue;
} else if(ifTagName(in, "comment")) {
@@ -184,6 +457,21 @@ namespace jet {
} else if(ifTagName(in, "sql")) {
__sql _sql(in, out, global, this, local);
continue;
} else if(ifTagName(in, "imap")) {
__imap _imap(in, out, global, this, local);
continue;
} else if(ifTagName(in, "imaplist")) {
__imaplist _imaplist(in, out, global, this, local);
continue;
} else if(ifTagName(in, "imapmessage")) {
__imapmessage _imapmessage(in, out, global, this, local);
continue;
} else if(ifTagName(in, "imapflag")) {
__imapflag _imapflag(in, out, global, this, local);
continue;
} else if(ifTagName(in, "imapdelete")) {
__imapdelete _imapdelete(in, out, global, this, local);
continue;
} else if(ifTagName(in, "whilerow")) {
__whilerow _whilerow(in, out, global, this, local);
continue;
@@ -214,6 +502,9 @@ namespace jet {
} else if(ifTagName(in, "set")) {
__set _set(in, out, global, this, local);
continue;
} else if(ifTagName(in, "eval")) {
__eval _eval(in, out, global, this, local);
continue;
} else if(ifTagName(in, "call")) {
__call _call(in, out, global, this, local);
continue;
@@ -251,10 +542,46 @@ namespace jet {
__dotag _dotag(in, out, global, this, local);
continue;
} else if(ifTagName(in, "container")) {
processContainer(container2);
in.ifNext("<container");
in.skipWhitespace();
in.ifNext("/>");
// Rendering logic lives in renderContainer (see Tag.h/below) -
// extracted, unchanged, so generated code for a compiled
// <tag name="X"> definition body (see jetc's TAGDEF handling)
// can call it directly too, without re-deriving the same
// scope-walking/recursion-guard logic.
renderContainer(out, container2);
// The old consumption here - in.ifNext("<container");
// in.skipWhitespace(); in.ifNext("/>"); - only ever handled
// a bare, lowercase, attribute-free "<container/>". Real
// 1.4 content writes this several other ways: uppercase
// (SESSIONCTL.tag's own <CONTAINER EVAL="NO">), with
// attributes, and closed with a bare ">" rather than "/>" -
// ifTagName(in, "container") above already matches all of
// these case-insensitively for DISPATCH, but the hardcoded
// lowercase "<container" literal consumption step then
// failed outright on any of them, consuming nothing at
// all and leaving the cursor exactly where it started -
// the dispatch loop re-entered this same branch forever,
// re-running processContainer(container2) with zero
// forward progress. Confirmed live via a loop-iteration
// guard showing "preview=[<CONTAINER EVAL=\"NO\">]"
// unchanged across tens of thousands of iterations.
// Consume properly instead: skip '<', the tag name itself
// (whatever case it was written in), then scan to the
// closing '>' - respecting quoted attribute values so a
// '>' inside one doesn't end the tag early - regardless of
// whether it was self-closed with '/>' or left as a bare
// '>' (a self-closing '/' is just consumed as an ordinary
// character by the scan below either way).
in.ifNext("<");
in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
while(!in.eod() && !in.ifNext(">")) {
if(in.ifNext("\"")) {
while(!in.eod() && !in.ifNext("\"")) in.nextChar();
} else if(in.ifNext("'")) {
while(!in.eod() && !in.ifNext("'")) in.nextChar();
} else {
in.nextChar();
}
}
continue;
} else {
out.write(in.nextChar());
@@ -279,9 +606,15 @@ namespace jet {
}
bool Tag::ifTagName(coreutils::ZString &in, const char *tag) {
// Case-insensitive - real 1.4 content invokes built-ins in every
// case (<MYSQL>, <Sql>, <DATABASE>, ...), and this is the dispatch
// that decides which __xxx class handles a tag at all, so a
// case-sensitive miss here doesn't throw, it just silently treats
// the tag as unrecognized fallback content instead.
in.push();
if(in.ifNext("<"))
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(tag)) {
if(in.ifNext("<")) {
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
if(token.toLower() == coreutils::MString(tag).toLower()) {
if(in.ifNext(" ")) {
in.pop();
return true;
@@ -293,14 +626,17 @@ namespace jet {
return true;
}
}
}
in.pop();
return false;
}
bool Tag::ifTagName(coreutils::ZString &in) {
// Case-insensitive - same reasoning as ifEndTagName above.
in.push();
if(in.ifNext("<"))
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(name)) {
if(in.ifNext("<")) {
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
if(token.toLower() == coreutils::MString(name).toLower()) {
in.push();
if(in.ifNext(" ")) {
in.pop();
@@ -314,11 +650,17 @@ namespace jet {
}
in.pop();
}
}
in.pop();
return false;
}
bool Tag::findTagDefinition(coreutils::MString name, coreutils::ZString &result) {
// Case-insensitive, matching __tag.cpp's own registration fix -
// real 1.4 content declares and invokes a custom tag in different
// case at different sites (SESSIONCTL.tag's <TAG NAME='TEMPLATE'>
// vs mainpagetemplate.temp's <template>...</template>).
name = name.toLower();
Tag *scope = this;
while(scope) {
if(scope->isCustomTagBoundary && scope->localTags.count(name)) {
@@ -358,12 +700,17 @@ namespace jet {
}
bool Tag::ifEndTagName(coreutils::ZString &in) {
// Case-insensitive, matching jetc's own compile-time matchTagClose
// fix - real 1.4 content closes tags in whatever case it opened
// them with (e.g. SESSIONCTL.tag's <tag name="linkbutton"> ... </TAG>).
in.push();
if(in.ifNext("</"))
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(name)) {
if(in.ifNext("</")) {
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
if(token.toLower() == coreutils::MString(name).toLower()) {
if(in.ifNext(">"))
return true;
}
}
in.pop();
return false;
}
@@ -371,7 +718,7 @@ namespace jet {
bool Tag::ifSplitTagName(coreutils::ZString &in) {
in.push();
if(in.ifNext("<"))
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(splitTagName)) {
if(coreutils::MString(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")).toLower() == coreutils::MString(splitTagName).toLower()) {
if(in.ifNext(">"))
in.pop();
return true;
@@ -412,6 +759,17 @@ namespace jet {
return keywords.find(keyword) != keywords.end();
}
namespace {
// Every built-in tag that uses splitTagName "else" - shared by
// ifNested(in)'s own cross-name fallback below and the new
// ifNested(in,tagName)/scanContainerNamed overloads. <try>'s own
// splitTagName is "catch", a different marker - deliberately not
// folded into this fix (no repro of the same bug shape there, and
// guessing its exact semantics without one risks getting it wrong).
const char *elseSplitTagNames[] = { "if", "while", "until", "ifrow" };
const int elseSplitTagNameCount = 4;
}
bool Tag::ifNested(coreutils::ZString &in) {
bool hasContainer = false;
if(ifTagName(in)) {
@@ -424,22 +782,152 @@ namespace jet {
hasContainer = false;
return true;
} else if(in.getTokenExclude("=").getLength() != 0) {
if(in.ifNext("=\"")) {
// Real 1.4 content quotes attribute values with either " or
// ' (e.g. <TAG NAME='TEMPLATE' SCOPE=LOCAL> nested inside
// SESSIONCTL.tag's own <sessionctl> definition) - accept
// either, closing with whichever character opened it.
bool dq = in.ifNext("=\"");
bool sq = !dq && in.ifNext("='");
if(dq || sq) {
while(1) {
if(in.ifNext("\"")) {
if(in.ifNext(dq ? "\"" : "'")) {
break;
}
in.nextChar();
}
} else {
// Unquoted attribute value (e.g. TYPE=NE, SCOPE=LOCAL -
// real 1.4 content throughout, including SESSIONCTL.tag's
// own <TAG NAME='TEMPLATE' SCOPE=LOCAL>). Neither quote
// style matched, but the getTokenExclude("=") above
// already consumed the attribute NAME and left the cursor
// sitting exactly on '=' - without also consuming '=' and
// the unquoted value here, the next iteration's
// getTokenExclude("=") returns empty (cursor is already
// AT '=') and this loops forever with zero forward
// progress. Confirmed live via gdb: three snapshots over
// 15s showed IDENTICAL stack depth and cursor position,
// not a slow-but-progressing recursion.
in.nextChar(); // consume '='
while(!in.eod()) {
char c = in.charAt(0);
if(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '>' || c == '/')
break;
in.nextChar();
}
}
}
}
if(hasContainer)
scanContainer(in);
return false;
}
// Same-name match failed - if THIS tag itself is one of the
// splitTagName="else" conditionals (if/while/until/ifrow), a
// DIFFERENTLY-named one of that same set nested here (e.g. an
// <if> nested directly inside an <ifrow>'s own body) needs to be
// recognized and skipped too, exactly like a same-name nested
// occurrence already is above - otherwise the inner tag's own
// <else>/</...> markers get read as if they belonged to THIS
// (outer) tag's own boundary scan. Confirmed via a real, minimal
// repro: <ifrow>...<if expr="..."><else>...</if>...<else>...
// </ifrow> - the outer <ifrow> incorrectly split on the INNER
// <if>'s own <else>, and the inner <if>'s real closing </if> then
// leaked into the rendered output as literal text (found while
// investigating a real "successful login silently doesn't
// proceed" report - login.method's own <ifrow><if expr=...>...
// </if></ifrow> structure hits this exactly).
if(splitTagName == "else") {
for(int i = 0; i < elseSplitTagNameCount; i++) {
if(ifNested(in, elseSplitTagNames[i]))
break;
}
}
return false;
}
// See Tag.h's own doc comment on this overload set. Mirrors
// ifNested(in) above exactly, but checks an explicit tagName (via
// ifTagName(in,tagName)) instead of this->name, and skips the
// nested tag's own body (if any) via scanContainerNamed(in,tagName)
// instead of scanContainer(in) - so it correctly stops at THAT
// tag's own close, not this outer tag's.
bool Tag::ifNested(coreutils::ZString &in, const char *tagName) {
bool hasContainer = false;
if(ifTagName(in, tagName)) {
while(!in.eod()) {
in.skipWhitespace();
if(in.ifNext(">")) {
hasContainer = true;
break;
} else if(in.ifNext("/>")) {
hasContainer = false;
return true;
} else if(in.getTokenExclude("=").getLength() != 0) {
bool dq = in.ifNext("=\"");
bool sq = !dq && in.ifNext("='");
if(dq || sq) {
while(1) {
if(in.ifNext(dq ? "\"" : "'")) {
break;
}
in.nextChar();
}
} else {
in.nextChar(); // consume '=' - see ifNested(in)'s own comment on why
while(!in.eod()) {
char c = in.charAt(0);
if(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '>' || c == '/')
break;
in.nextChar();
}
}
}
}
if(hasContainer)
scanContainerNamed(in, tagName);
return true;
}
return false;
}
bool Tag::ifEndTagName(coreutils::ZString &in, const char *tagName) {
in.push();
if(in.ifNext("</")) {
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
if(token.toLower() == coreutils::MString(tagName).toLower()) {
if(in.ifNext(">"))
return true;
}
}
in.pop();
return false;
}
// Like scanContainer(in) above, but scans for tagName's own close
// rather than this->name's - and, since whatever's nested INSIDE
// tagName's own body could itself contain any mix of the four
// splitTagName="else" conditionals (not just tagName repeated), tries
// all four at each position rather than only tagName itself. This is
// what actually skips PAST an inner conditional's entire span
// (attributes, body, close tag) when ifNested(in)'s own cross-name
// fallback recognizes one nested in a DIFFERENTLY-named outer tag.
void Tag::scanContainerNamed(coreutils::ZString &in, const char *tagName) {
while(!in.eod()) {
if(ifEndTagName(in, tagName))
return;
bool matchedNested = false;
for(int i = 0; i < elseSplitTagNameCount; i++) {
if(ifNested(in, elseSplitTagNames[i])) {
matchedNested = true;
break;
}
}
if(!matchedNested)
in.nextChar();
}
}
coreutils::MString Tag::getVariable(coreutils::ZString &variable, bool inContainer) {
if(variable.ifNext("$[")) {
coreutils::MString name;
@@ -485,11 +973,60 @@ namespace jet {
renderVariableName(variable, name, modifier);
name.split(".");
if(name.getList().size() == 1) {
if(global.variables.find(name[0]) == global.variables.end())
throw coreutils::Exception("global variable is not initialized.");
if(global.variables.find(name[0]) == global.variables.end()) {
// jet-1.4 fallback: a bare $[name] that isn't a real global
// also checks the current default query (sessionid="")
// before failing - real 1.4 source depends on this, e.g.
// <sql>select ...</sql> immediately followed by a bare
// $[description] with no explicit $[.description] dot.
// 2.0 originally required the dot; this restores 1.4's
// more forgiving behavior without requiring the real
// source to be rewritten.
coreutils::MString defaultSession("");
if(global.sessionExists(defaultSession)) {
try {
coreutils::MString columnValue = global.getSession(defaultSession)->getColumnValue(name[0]);
return processModifier(columnValue, modifier);
} catch(coreutils::Exception &) {
// No such column in whatever's currently in the default
// session (or no query has run on it yet) - fall through
// to the empty-string default below rather than propagate.
}
}
// jet-1.4 fallback #2: a genuinely never-initialized bare $[name]
// (no global, no session/row match either) reads as an empty
// string, not a hard error - real 1.4 source depends on this too
// (e.g. SESSIONCTL.tag's own
// <if value1="$[_session_id]" value2="" type="ne"> for a fresh,
// no-cookie visitor - $[_session_id] was never set by anything
// at that point). 2.0 originally threw "global variable is not
// initialized" for this - matches ordinary template-language
// semantics (undefined reads as empty) far better than erroring
// on every fresh page hit.
coreutils::MString empty("");
return processModifier(empty, modifier);
}
return processModifier(global.variables[name[0]], modifier);
}
return global.getSessionVariable(name);
// Same jet-1.4 fallback as the bare (undotted) case just above,
// extended to the explicit $[session.column] form: real content
// (invoice.method's own $[.amount]/$[.invnumber]/etc., read
// right after a <sql>...where i.id=$[_invoice_id]</sql> that
// legitimately has no matching row when no invoice id was ever
// passed in - e.g. thankyou.page's unconditional <include
// file="invoice.method">) depends on a missing column/session
// reading as empty, not a hard error. This call previously threw
// straight through with no catch at all here - confirmed live,
// this exact page ("column does not exist in session result.")
// was an uncaught propagation from here, not the already-guarded
// 1-part path above.
try {
coreutils::MString sessionValue = global.getSessionVariable(name);
return processModifier(sessionValue, modifier);
} catch(coreutils::Exception &) {
coreutils::MString empty("");
return processModifier(empty, modifier);
}
}
throw coreutils::Exception("expected variable name or type designator.");
} else if(variable.ifNext("#[")) {
@@ -507,9 +1044,63 @@ namespace jet {
// tag invocation with no enclosing local-scope-owning tag.
if(local == NULL)
throw coreutils::Exception("local variable requested but no local scope is active.");
if(local->variables.find(name) == local->variables.end())
throw coreutils::Exception("local variable is not initialized.");
return local->variables[name];
// #[name] most commonly refers to some ENCLOSING custom tag's own
// declared/passed attribute value - e.g. setpage's own body reads
// #[NAME]/#[DIR] (its own keywords, found at the first scope
// checked below), but sessionctl's body invokes
// <setpage name="#[PAGE]">, where "#[PAGE]" must resolve against
// SESSIONCTL's own "page" keyword, not setpage's (setpage never
// declares "page" - only "NAME DIR"). Since __dotag binds each
// custom tag invocation's own local=this (so a tag's body sees
// its OWN attributes first), reaching an ancestor's attributes
// requires walking the lexical containment chain via `parent`
// (the same chain findTagDefinition() already walks for tag
// DEFINITION lookups) rather than checking a single scope.
// local->variables (explicit <set scope="local"> only) is checked
// at each level too, ahead of that level's keywords, so a local
// <set> can shadow an attribute of the same name at that scope.
for(Tag *scope = local; scope; scope = scope->parent) {
if(scope->variables.find(name) != scope->variables.end())
return scope->variables[name];
// Only consult a scope's own keywords when it's a real custom
// tag invocation (isCustomTagBoundary - see __tag.cpp/Tag.h),
// not a control-flow construct like <if>/<while>/<until> that
// also binds local=this for ITS OWN internal value1/value2/
// type comparison keywords. Those are never meant to be
// visible to #[...] reads from nested content - they collide
// with real, unrelated attribute names on the ENCLOSING custom
// tag constantly (barant.tag's own <field> declares its own
// "type" keyword - the input's type="text" - and its
// definition immediately nests
// <if value1="#[type]" value2="multiline" type="ne">, whose
// OWN "type" keyword is the comparison operator "ne" - #[type]
// read from further inside that <if> must reach field's "type"
// two scopes up, not the <if>'s own "ne" one scope up).
// Confirmed via real rendered output: without this,
// <input type="#[type]"> rendered type="eq" (the nearest <if>'s
// own comparison type) instead of type="text" (the field's).
if(scope->isCustomTagBoundary) {
// Attribute names are stored lowercase (see the main
// constructor's attribute-parsing loop); the #[name]
// designator itself stays case-sensitive as written, only
// the keywords-map lookup key is lowered to match that
// storage.
coreutils::MString lname = coreutils::MString(name).toLower();
if((scope->keywords.find(lname) != scope->keywords.end()) &&
(resolvingKeywords.count(std::pair<Tag*, coreutils::MString>(scope, lname)) == 0))
return scope->resolveKeyword(lname);
}
}
// jet-1.4 fallback: a bare #[name] that was never passed as an
// attribute anywhere in the enclosing scope chain and never
// locally <set> reads as an empty string, not a hard error - real
// 1.4 content depends on this throughout (e.g. SESSIONCTL.tag's
// <page> definition checks #[secure]/#[admin]/#[loggedin]
// unconditionally, but most real .page files - including
// login.page's own <page template="mainpagetemplate">, no other
// attributes - never pass them at all).
coreutils::MString empty("");
return processModifier(empty, modifier);
}
throw coreutils::Exception("Expecting a variable initializer ('$[' or '#[').");
}
@@ -549,8 +1140,30 @@ namespace jet {
void Tag::assignVariable(coreutils::ZString variable, coreutils::MString value, coreutils::ZString scope) {
if(variable.startsWith("@")) {
coreutils::ZString sessionName = variable;
sessionName.ifNext("@");
// NOT sessionName.ifNext("@") - that only advances sessionName's
// own read cursor past the "@", it doesn't produce a string whose
// OWN logical start is there. JString::locate() (used internally
// by JFile's operator[] to find an EXISTING key to replace, not
// just append a new one) resets whatever ZString it's given back
// to ITS OWN position 0 partway through searching - for a
// cursor-advanced view over the ORIGINAL "@name" buffer, position
// 0 is still '@', so the search silently looks for "@name" instead
// of "name". That only matters once the session file already has
// real content loaded from a PRIOR request to search through - a
// brand new/empty file has nothing to find either way, so this
// looked fine on a first write and only broke on session vars that
// outlive one request (login state read back on a later page,
// exactly what this mechanism exists for). Confirmed via a real
// corrupted session file: <clearenv>'s own <set name="@#[name]"
// value=""> calls (see SESSIONCTL.tag) never found the existing
// "_login_id" key that a PRIOR request's <setenv> had written, so
// each one appended a brand new "_login_id":"" pair instead of
// replacing it - duplicate keys, with whichever occurrence a given
// JSON reader picks (first or last) an unreliable coin flip, not a
// deliberate "cleared" state. substring(1) - not ifNext(), not
// reset() - is what actually produces an independent copy starting
// AT that position, immune to being reset back past it.
coreutils::MString sessionName = variable.substring(1);
if(global.sessionFile == NULL)
throw coreutils::Exception("session variable assignment requested but no session is active (missing sessiondir keyword, or cgi mode is off).");
(*global.sessionFile)[sessionName] = value;
@@ -561,11 +1174,48 @@ namespace jet {
else if(scope == "local") {
if(local == NULL)
throw coreutils::Exception("scope=\"local\" requested but no local scope is active.");
local->variables[variable] = value;
// Same reasoning as scope="parent" just below, one scope closer:
// `local` itself isn't necessarily a real custom tag invocation -
// <if>/<while>/<until> also bind local=this. A <set scope="local">
// written inside one of THEIR branches (barant.tag's own <field>
// definition: <if expr="..."><set name="class" value="..."
// scope="local"><else>...</if>) stores onto that transient <if>
// instance, which is destructed the moment </if> closes - so by
// the time <field>'s own #[class] read runs later in the SAME
// definition (outside the <if>), the value is already gone,
// falling to the empty-string fallback. Confirmed via real
// rendered output: class="" instead of class="fieldinput". Walk
// up to the nearest real scope boundary first, same as
// scope="parent"/__tag.cpp/the bare <container> fix.
Tag *localScope = local;
while(localScope->parent && !localScope->isCustomTagBoundary)
localScope = localScope->parent;
localScope->variables[variable] = value;
} else if(scope == "parent") {
if((local == NULL) || (local->parent == NULL))
throw coreutils::Exception("scope=\"parent\" requested but no local scope (or its parent) is active.");
local->parent->variables[variable] = value;
// Walk up from local->parent to the nearest real scope boundary
// (isCustomTagBoundary), the same way __tag.cpp's own tag-
// DEFINITION registration already does - a bare parent hop lands
// on whatever C++ object happens to be the immediate caller in
// the dispatch chain, which for content reached through
// transparent wrapper constructs (<eval>, <include>) is that
// wrapper itself, not the custom tag it's lexically nested
// inside. SESSIONCTL.tag's own <TAG NAME='TEMPLATE'> definition
// depends on this: its
// <EVAL NAME=TEMPLATEDATA SCOPE=PARENT><CONTAINER EVAL="NO"></EVAL>
// is reached via <page>'s own
// <EVAL><INCLUDE FILE="...#[TEMPLATE].temp"></EVAL> - without
// this walk, TEMPLATEDATA landed on the transient __include
// instance's own scope (one hop from TEMPLATE) rather than
// <page>'s (two hops away, past the wrapper), so <page>'s own
// later #[TEMPLATEDATA] read - itself walking the real scope-
// boundary chain via getVariable's own parent-chain fix - never
// found it.
Tag *scope2 = local->parent;
while(scope2->parent && !scope2->isCustomTagBoundary)
scope2 = scope2->parent;
scope2->variables[variable] = value;
}
}
@@ -575,35 +1225,35 @@ namespace jet {
void Tag::storeVariable(coreutils::ZString variable) {
if(keywordDefined("expr")) {
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
assignVariable(variable, Operand(keywords["expr"], *this).string, "global");
else if(resolveKeyword("scope") == "local")
else if(resolveKeyword("scope").toLower() == "local")
assignVariable(variable, Operand(keywords["expr"], *this).string, "local");
else if(resolveKeyword("scope") == "parent")
else if(resolveKeyword("scope").toLower() == "parent")
assignVariable(variable, Operand(keywords["expr"], *this).string, "parent");
} else if(hasContainer) {
processContainer(container);
if(evaluate) {
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
assignVariable(variable, out, "global");
else if(resolveKeyword("scope") == "local")
else if(resolveKeyword("scope").toLower() == "local")
assignVariable(variable, out, "local");
else if(resolveKeyword("scope") == "parent")
else if(resolveKeyword("scope").toLower() == "parent")
assignVariable(variable, out, "parent");
} else {
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
assignVariable(variable, container, "global");
else if(resolveKeyword("scope") == "local")
else if(resolveKeyword("scope").toLower() == "local")
assignVariable(variable, container, "local");
else if(resolveKeyword("scope") == "parent")
else if(resolveKeyword("scope").toLower() == "parent")
assignVariable(variable, container, "parent");
}
} else {
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
assignVariable(variable, resolveKeyword("value"), "global");
else if(resolveKeyword("scope") == "local")
else if(resolveKeyword("scope").toLower() == "local")
assignVariable(variable, resolveKeyword("value"), "local");
else if(resolveKeyword("scope") == "parent")
else if(resolveKeyword("scope").toLower() == "parent")
assignVariable(variable, resolveKeyword("value"), "parent");
}
}
+31
View File
@@ -72,6 +72,20 @@ namespace jet {
// actual definition to expand).
bool findTagDefinition(coreutils::MString name, coreutils::ZString &result);
// Renders the enclosing custom tag invocation's own nested content -
// the <container> marker inside a <tag name="X"> definition body -
// into `out`. Extracted, unchanged, from parseContainer's own
// "container" dispatch branch (see Tag.cpp) so generated code for a
// compiled tag-definition body (see jetc's TAGDEF handling) can call
// this exact logic directly instead of going through the raw-text
// scan to reach it - walks up from `local` to the nearest
// isCustomTagBoundary ancestor not already being resolved (guards
// the pass-through self-reference case, e.g. linkbutton's own
// <EVAL><CONTAINER></EVAL>) and renders THAT scope's own ->container;
// falls back to rendering container2 if no such ancestor exists,
// exactly matching parseContainer's own fallback for the same case.
void renderContainer(coreutils::MString &out, coreutils::ZString container2 = NULL);
protected:
bool hasContainer = false;
bool hasContainer2 = false;
@@ -107,6 +121,23 @@ namespace jet {
bool ifEndTagName(coreutils::ZString &in);
bool ifSplitTagName(coreutils::ZString &in);
// ifNested(in)'s own same-name-only check misses a DIFFERENTLY
// named nested split-tag construct - e.g. an <if> nested inside an
// <ifrow>'s own body (both use splitTagName "else"): ifNested(in)
// only recognizes another nested <ifrow>, so an inner <if>'s own
// <else>/</if> markers were being read as if they belonged to the
// OUTER <ifrow>'s own boundary scan, corrupting both. This overload
// set (ifNested/ifEndTagName parameterized by an explicit tag name,
// plus scanContainerNamed) generalizes the exact same logic to any
// of the built-in splitTagName="else" conditionals - if/while/
// until/ifrow - so the outer tag's boundary scan correctly skips
// PAST an inner one of any of these, regardless of name, before
// resuming its own search. See Tag.cpp's own doc comment on the
// shared splitTagNames list for the real story/repro.
bool ifNested(coreutils::ZString &in, const char *tagName);
bool ifEndTagName(coreutils::ZString &in, const char *tagName);
void scanContainerNamed(coreutils::ZString &in, const char *tagName);
coreutils::MString processModifier(coreutils::MString &value, coreutils::MString &modifier);
};
+13 -5
View File
@@ -16,14 +16,22 @@ namespace jet {
throw coreutils::Exception("call tag cannot have both input keyword and have a container.");
if(!keywordDefined("pgm"))
throw coreutils::Exception("pgm keyword must be specified.");
for(ix = 0; ix <= 50; ++ix)
for(ix = 0; ix < 50; ++ix)
argv[ix] = NULL;
argv[0] = resolveKeyword("pgm").c_str(); // TODO: Need to peel off the program name only and pass as argv[0].
for(ix = 1; ix <= 50; ++ix) {
// Reserve up front - argStrings must never reallocate once a
// c_str() pointer from one of its elements has been stored into
// argv[] below, or that pointer dangles exactly like the bug this
// replaces (see the .h's own comment). 50 arg slots + argv[0]'s
// own program name.
argStrings.reserve(51);
argStrings.push_back(resolveKeyword("pgm")); // TODO: Need to peel off the program name only and pass as argv[0].
argv[0] = argStrings.back().c_str();
for(ix = 1; ix < 50; ++ix) {
coreutils::MString arg("arg");
arg << ix;
if(keywordDefined(arg)) {
argv[ix] = resolveKeyword(arg).c_str();
argStrings.push_back(resolveKeyword(arg));
argv[ix] = argStrings.back().c_str();
} else
break;
}
@@ -54,7 +62,7 @@ namespace jet {
close(fdi[1]);
dup2(fdi[0], 0);
}
rc = execvpe(resolveKeyword("pgm").c_str(), argv, global.envp);
rc = execvpe(argv[0], argv, global.envp);
close(fdo[1]);
exit(errno);
}
+16
View File
@@ -2,6 +2,7 @@
#define ____call_h__
#include "Tag.h"
#include <vector>
namespace jet {
@@ -19,6 +20,21 @@ namespace jet {
int rc;
char *argv[50];
// Owns the actual character storage argv[] points into. Resolved
// MStrings used to be created as unnamed temporaries with only
// their .c_str() pointer kept (argv[ix] = resolveKeyword(arg)
// .c_str()) - the temporary is destroyed at the end of that same
// statement, so argv[ix] was a dangling pointer from that point
// on, read only much later by execvpe() in the forked child.
// Undefined behavior - confirmed via a real repro: two sequential
// <call> tags (date, then cp using date's own captured output)
// corrupted each other's arguments, producing a "cp" invocation
// that actually ran /bin/date with garbage arguments instead.
// Reserved to its final size up front (see the constructor) so no
// push_back can reallocate and invalidate a c_str() pointer
// already stored in argv[] earlier in the same construction.
std::vector<coreutils::MString> argStrings;
};
}
+31 -2
View File
@@ -3,12 +3,22 @@
namespace jet {
__dotag::__dotag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
__dotag::__dotag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
// Every invocation of a custom tag is itself a new scope boundary -
// a <tag name="..."> encountered while expanding this invocation's
// own template (below) registers into THIS instance's localTags,
// not the global map, so it's only visible for the rest of this
// expansion. See Tag.h's isCustomTagBoundary/localTags doc comment.
//
// local=this (bound above, in the base Tag constructor call rather
// than forwarding the caller's own local) is what makes a custom
// tag's own body see ITS OWN declared/passed attributes via
// #[name] - matches the pattern __if/__while/__until already use
// for the same reason. Without this, #[name] reads inside e.g.
// SESSIONCTL.tag's <sessionctl>/<setpage>/<retain> bodies resolved
// against whatever local scope happened to be active in the
// caller instead of this invocation's own attributes, and always
// fell through to the empty-string fallback.
isCustomTagBoundary = true;
// The base Tag constructor already set hasContainer from whether
@@ -28,10 +38,29 @@ namespace jet {
// this invocation was written.
hasContainer = true;
// Fast path: if jetc compiled this tag's definition directly (a
// top-level <tag name="X"> - see JetCodegen's TAGDEF handling), a
// render function was registered under its lowercase name (matching
// __tag.cpp's own registration key convention) instead of - or
// alongside - the raw text findTagDefinition()/processContainer()
// below would otherwise have to re-parse on every single invocation.
// A miss here (locally-scoped/nested definitions, or a tag that was
// never part of a compiled module) falls straight through to that
// exact same interpreted path, unchanged - see Global.h's own doc
// comment on compiledTags.
coreutils::MString nameLower = coreutils::MString(name).toLower();
auto compiledIt = global.compiledTags.find(nameLower);
if(compiledIt != global.compiledTags.end()) {
// Same gate processContainer() below applies on the interpreted
// path - keeps both paths behaviorally identical rather than
// having the compiled fast path unconditionally render.
if(hasContainer && evaluate)
compiledIt->second(*this, out);
} else {
coreutils::ZString container3;
if(!findTagDefinition(name, container3))
throw coreutils::Exception("tag definition not found.");
processContainer(container3, container);
}
}
}
+29 -7
View File
@@ -15,18 +15,40 @@ namespace jet {
throw coreutils::Exception("for tag requires end keyword.");
if(!keywordDefined("step"))
throw coreutils::Exception("for tag requires step keyword.");
// Where to write the loop counter (which variables map, and under
// what name) is a static property of this <for>'s own invocation -
// "scope"/"name" have no sensible reason to change mid-loop, so
// resolve and branch on them once instead of re-resolving both
// (and re-checking scope with up to 3 comparisons) on every single
// iteration. Loop bounds (end/step) are deliberately left
// re-resolved per iteration exactly as before - real content could
// plausibly rely on a bound that changes as a side effect of the
// loop body itself, and there's no clear evidence either way, so
// that part stays conservative/unchanged.
coreutils::MString counterVarName;
enum { SCOPE_GLOBAL, SCOPE_LOCAL, SCOPE_PARENT } counterScope = SCOPE_GLOBAL;
if(nameDefined) {
counterVarName = resolveKeyword("name");
if(keywordDefined("scope")) {
coreutils::MString scopeVal = resolveKeyword("scope");
if(scopeVal == "global") counterScope = SCOPE_GLOBAL;
else if(scopeVal == "local") counterScope = SCOPE_LOCAL;
else if(scopeVal == "parent") counterScope = SCOPE_PARENT;
else throw coreutils::Exception("scope value is not valid.");
}
}
for(double ix = counter; ix <= resolveKeyword("end").asDouble(); ix += resolveKeyword("step").asDouble()) {
resolveKeyword("end").reset();
resolveKeyword("step").reset();
if(nameDefined) {
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
global.variables[resolveKeyword("name")] = ix;
else if(resolveKeyword("scope") == "local")
this->local->variables[resolveKeyword("name")] = ix;
else if(resolveKeyword("scope") == "parent")
parent->local->variables[resolveKeyword("name")] = ix;
if(counterScope == SCOPE_GLOBAL)
global.variables[counterVarName] = ix;
else if(counterScope == SCOPE_LOCAL)
this->local->variables[counterVarName] = ix;
else
throw coreutils::Exception("scope value is not valid.");
parent->local->variables[counterVarName] = ix;
}
processContainer(container);
container.reset();
+1 -1
View File
@@ -16,7 +16,7 @@ namespace jet {
throw coreutils::Exception("type expected if value1 and value2 specified.");
} else
throw coreutils::Exception("value2 required if value1 specified.");
coreutils::MString type = resolveKeyword("type");
coreutils::MString type = resolveKeyword("type").toLower();
if((type != "eq") &&
(type != "ne") &&
(type != "lt") &&
+23 -3
View File
@@ -8,12 +8,32 @@
namespace jet {
__ifrow::__ifrow(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this, "else") {
output = false;
// NOT setting output=false here (an earlier version of this file
// did) - that flag gates Tag::~Tag()'s own copyContainer(out,
// parentOut) call, the mechanism that propagates whatever
// processContainer() below actually wrote up to this tag's own
// caller. <ifrow>'s entire purpose is to conditionally DISPLAY one
// of its two branches (exactly like <if>/<while>/<until>, none of
// which ever touch `output`) - unlike the tags that legitimately
// do set it (<set>/<sql>/<cookie>/<header>/<write>/<tag>/
// <comment>/<stream>, none of which have any visible content of
// their own to emit), so setting it here silently discarded
// EVERY <ifrow>'s rendered content, true branch or false, on every
// single use. Confirmed live via gdb-style tracing: hasRow(),
// the resolved session pointer, and container's own text were all
// exactly correct at the point processContainer(container) ran -
// the content just never reached parentOut because the destructor
// skipped the copy. Never caught before because no real content
// this session exercised an <ifrow> with real row data AND had
// its rendered output actually inspected (account.page's own
// <ifrow sessionid="projman"> usage always redirected before
// reaching it, for lack of a login session).
if(!hasContainer)
throw coreutils::Exception("ifrow tag must have a container.");
if(!global.sessionExists(keywords[resolveKeyword("sessionid")]))
coreutils::MString sessionId = resolveKeyword("sessionid");
if(!global.sessionExists(sessionId))
throw coreutils::Exception("sessionid does not exist.");
if(global.getSession(keywords[resolveKeyword("sessionid")])->hasRow())
if(global.getSession(sessionId)->hasRow())
processContainer(container);
else
processContainer(container2);
+71 -2
View File
@@ -1,22 +1,85 @@
#include "__include.h"
#include "Exception.h"
#include "File.h"
#include <string>
#include <unordered_map>
#include <sys/stat.h>
namespace jet {
namespace {
struct CachedInclude {
std::string content;
time_t mtime;
};
// Persistent, per-worker-thread cache of <include> file contents,
// keyed by resolved filename. Real content depends on this
// constantly through custom tag bodies that jetc's own compile-
// time <include>-inlining doesn't reach (only the top-level .jet
// source's own includes get compiled in) - mainpagetemplate.temp
// alone pulls in login.menu/menu.bar/opensource.menu/cart.menu/
// sessionvar.menu, all previously re-read from disk on every
// single request even though the files are 100% static between
// edits. Invalidated via mtime comparison (a stat() call, cheap
// relative to a full read()) so a live edit still takes effect on
// the very next request - matching the workflow already relied on
// all session of editing .tag/.temp/.menu content directly and
// seeing it live without a rebuild.
thread_local std::unordered_map<std::string, CachedInclude> includeCache;
}
__include::__include(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
if(!keywordDefined("file"))
throw coreutils::Exception("file keyword must be specified.");
if(hasContainer)
throw coreutils::Exception("include tag should not have a container.");
hasContainer = true;
coreutils::File file(resolveKeyword("file"));
coreutils::MString includeFileName = resolveKeyword("file");
std::string fileNameKey = includeFileName.str();
struct stat st;
bool haveStat = (stat(fileNameKey.c_str(), &st) == 0);
auto cached = includeCache.find(fileNameKey);
if(cached != includeCache.end() && haveStat && cached->second.mtime == st.st_mtime) {
container = coreutils::ZString(cached->second.content.data(), cached->second.content.length());
} else {
coreutils::File file(includeFileName);
file.read();
if(haveStat) {
CachedInclude &entry = includeCache[fileNameKey];
entry.content = file.asString();
entry.mtime = st.st_mtime;
container = coreutils::ZString(entry.content.data(), entry.content.length());
} else {
// Couldn't stat the file (unusual - e.g. a race with deletion) -
// don't cache something we can't validate the freshness of,
// just render this one read directly, matching the pre-cache
// behavior exactly for this edge case.
container = file.asZString();
}
}
try {
processContainer(container);
}
catch(coreutils::Exception e) {
// global.errorCursor is whatever cursor was active in whichever
// ZString buffer was being parsed at the moment the ORIGINAL
// exception was thrown - not necessarily this include's own
// `container` buffer at all (e.g. a keyword-resolution error
// happening while interpreting a completely different .temp
// file's own text). setCursor() on a pointer outside container's
// own [data, data+length] range throws "Cursor out of range on
// setCursor." - and since that happens INSIDE this diagnostic-
// only "show a nice line number" block, it was replacing the
// real error (e.text) with that unrelated cursor-range message
// before it ever reached the caller, making every real error
// from inside an <include> impossible to see. This is purely
// diagnostic output - if it can't compute a line number, fall
// back to printing the real error text without one rather than
// losing it entirely.
try {
container.setCursor(global.errorCursor);
container.moveBackToLineStart();
std::cout << "-----------------------------" << std::endl;
@@ -26,8 +89,14 @@ namespace jet {
std::cout << container.parsed() << std::endl;
std::cout << "******** Error caught: " << e.text << std::endl;
std::cout << container.unparsed() << std::endl;
} catch(coreutils::Exception &) {
std::cout << "-----------------------------" << std::endl;
std::cout << "Error in included script '" << variables["file"] << "' (line number unavailable - error originated outside this include's own content)" << std::endl;
std::cout << "Error text: " << e.text << std::endl;
std::cout << "-----------------------------" << std::endl;
}
global.errorCursor = in.getCursor();
throw coreutils::Exception("error in included file.");
throw coreutils::Exception(e.text);
}
}
+194 -22
View File
@@ -1,34 +1,146 @@
#include "__mysql.h"
#include "Exception.h"
#include <iostream>
#include <string>
#include <unordered_map>
namespace jet {
namespace {
struct PooledConnection {
MYSQL *handle;
std::string host, user, database;
};
// Persistent, per-worker-thread connection cache - reused across
// requests instead of a fresh mysql_real_connect() every time.
// Safe with no locking: the apiserver's EPoll worker pool is a
// fixed set of OS threads for the process's whole life (see
// MysqlThreadScope's own doc comment - mysql_thread_init() runs
// once per worker thread at thread start), so a thread_local
// instance here means a given MYSQL* handle is only ever touched
// by the one thread that created it, never concurrently accessed.
// Keyed by sessionid, which is how this codebase's own <database>/
// <sql>/<ifrow> tags already address a specific connection
// (Global::sessions is keyed the same way) - the cached host/user/
// database are kept alongside purely as a defensive check that a
// reused entry really matches what THIS invocation asked for,
// not a real expectation that sessionid is ever reused across
// genuinely different backing databases in practice.
thread_local std::unordered_map<std::string, PooledConnection> connectionPool;
}
__mysql::__mysql(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
if(!keywordDefined("host"))
throw coreutils::Exception("host must be specified for mysql tag.");
if(!keywordDefined("database"))
// jet-1.4's <database> spells the same attribute "name" instead of
// "database" (e.g. SESSIONCTL.tag's own <sessionctl> definition) -
// accept either rather than requiring that real content to change.
coreutils::ZString databaseKeyword = keywordDefined("database") ? "database" : "name";
if(!keywordDefined(databaseKeyword))
throw coreutils::Exception("database must be specified for mysql tag.");
if(!keywordDefined("user"))
throw coreutils::Exception("user must be specified for mysql tag.");
if(!keywordDefined("password"))
throw coreutils::Exception("password must be specified for mysql tag.");
sessionId = keywords[resolveKeyword("sessionid")];
// Same double-indirection bug as the host/user/password/database
// fix above - resolveKeyword("sessionid") already returns the
// resolved VALUE (e.g. "_SESSIONCTL"), so wrapping it in keywords[...]
// used that value as a map KEY instead, auto-vivifying an empty
// string (no attribute is ever literally named "_SESSIONCTL").
// sessionId was therefore always empty regardless of what
// sessionid= actually specified - confirmed live via gdb: two
// real <mysql>/<database> tags with genuinely different sessionid
// values ("" and "_SESSIONCTL") both registered under "", the
// second colliding with "sessionid already exists.".
sessionId = resolveKeyword("sessionid");
// mysql_real_connect() returns NULL on failure but does NOT itself
// free the handle mysql_init() allocated - the caller is still
// expected to mysql_close() that original handle to avoid leaking
// it (MySQL C API docs). The previous code overwrote `mysql` with
// the connect() return value directly, so on failure the only
// pointer to the real handle was lost before ever being freed - a
// real leak on every failed connection attempt (this member's
// eventual value, NULL, is what a normal ~__mysql() would try to
// mysql_close() anyway, which is a safe no-op, but that never even
// runs here since the constructor throws below - see the
// addSession() comment for why that matters more).
// resolveKeyword() already returns the fully-resolved VALUE - the
// previous keywords[resolveKeyword("host")] wrapped that resolved
// VALUE ("localhost") back into a keywords[] lookup, i.e. used it
// as a MAP KEY instead of the value itself. Since no attribute is
// ever literally named "localhost"/the real username/etc.,
// std::map::operator[] silently auto-vivified an empty MString for
// every one of the four parameters - mysql_real_connect() was
// therefore always called with host/user/password/database all
// empty, regardless of what the tag actually specified. Confirmed
// live: MySQL's own error ("Access denied for user 'barant'@'localhost'
// (using password: NO)") showed the password was genuinely empty,
// not merely wrong.
coreutils::MString hostVal = resolveKeyword("host");
coreutils::MString userVal = resolveKeyword("user");
coreutils::MString passwordVal = resolveKeyword("password");
coreutils::MString databaseVal = resolveKeyword(databaseKeyword);
// Reuse a live connection this same worker thread already holds
// for this sessionid, rather than paying mysql_real_connect()'s
// full handshake cost on every single request. mysql_ping() is
// what makes this safe - it's a genuine round trip to the server,
// so a connection MySQL itself already dropped (its own
// wait_timeout, or an admin-initiated restart like this project
// already lived through once) is detected and discarded here
// rather than handed to processContainer() to fail on later.
std::string poolKey = sessionId.str();
auto pooled = connectionPool.find(poolKey);
if(pooled != connectionPool.end() &&
pooled->second.host == hostVal.str() &&
pooled->second.user == userVal.str() &&
pooled->second.database == databaseVal.str()) {
if(mysql_ping(pooled->second.handle) == 0) {
mysql = pooled->second.handle;
} else {
mysql_close(pooled->second.handle);
connectionPool.erase(pooled);
}
}
if(!mysql) {
MYSQL *handle = mysql_init(NULL);
mysql = mysql_real_connect(handle,
hostVal.c_str(),
userVal.c_str(),
passwordVal.c_str(),
databaseVal.c_str(), 0, NULL, 0);
if(!mysql) {
std::string err = mysql_error(handle);
mysql_close(handle);
throw coreutils::Exception("database connection failed: " + err);
}
connectionPool[poolKey] = PooledConnection{mysql, hostVal.str(), userVal.str(), databaseVal.str()};
}
// Registered only once the connection is confirmed live - a real,
// reproducible crash (heap corruption - "free(): invalid pointer"
// seen live, then two independent server-hang repros) traced back
// to this: addSession() used to run BEFORE the connect attempt, so
// a FAILED connection (which throws, right above) left a dangling
// `this` pointer registered under sessionId in Global's session
// map forever - ~__mysql() (which would normally call
// removeSession()) never runs for a constructor that itself threw,
// per ordinary C++ rules (only already-completed base-class
// subobjects get destroyed during exception unwinding, not the
// derived object whose constructor is still executing). The very
// next <mysql> tag construction using the same sessionId (e.g. two
// product pages with an empty sessionid="" back to back, both
// failing the same way) then collided with that stale entry.
// Confirmed via a real, deterministic two-request repro before this
// fix, and confirmed gone after it.
global.addSession(sessionId, this);
mysql = mysql_init(NULL);
mysql = mysql_real_connect(mysql,
keywords[resolveKeyword("host")].c_str(),
keywords[resolveKeyword("user")].c_str(),
keywords[resolveKeyword("password")].c_str(),
keywords[resolveKeyword("database")].c_str(), 0, NULL, 0);
if(!mysql)
throw coreutils::Exception("database and host parameters are not valid.");
processContainer(container);
}
@@ -36,7 +148,11 @@ namespace jet {
__mysql::~__mysql() {
global.removeSession(sessionId);
mysql_free_result(result);
mysql_close(mysql);
// mysql itself is deliberately NOT closed here anymore - see the
// connectionPool doc comment above the constructor. It's owned by
// this worker thread's persistent pool now and gets reused by
// whatever request this thread handles next, instead of being
// torn down and fully reconnected from scratch every time.
}
void __mysql::query(coreutils::MString query) {
@@ -46,6 +162,36 @@ namespace jet {
row = mysql_fetch_row(result);
fieldLength = mysql_fetch_lengths(result);
qFields = mysql_num_fields(result);
// Built once per query, not once per column LOOKUP - see the
// matching comment on getColumnValue() and on fieldIndex's own
// declaration in __mysql.h. mysql_fetch_fields() returns the
// whole field array in one call (mysql_fetch_field_direct()
// looping ix=0..qFields-1, as getColumnValue() used to do on
// every single named access, does the exact same work over and
// over for a result set whose schema never changes after this
// point).
fieldIndex.clear();
MYSQL_FIELD *fields = mysql_fetch_fields(result);
for(unsigned int ix = 0; ix < qFields; ++ix)
fieldIndex[std::string(fields[ix].name)] = (int)ix;
} else {
// A failed/errored query (real content builds one from an unset
// $[...] parameter, e.g. "where tasks.id=" with no value - genuine
// MySQL syntax error) previously left row/qFields holding whatever
// a PRIOR successful query on this same session object had set,
// since only the success branch above ever touched them. A later
// getColumnValue() call then looped 0..qFields (stale, nonzero)
// calling mysql_fetch_field_direct() against this NULL `result` -
// segfaulting (confirmed via gdb: SIGSEGV in
// mysql_fetch_field_direct, called from getColumnValue) instead of
// reaching the "column does not exist in session result." the
// caller already throws/catches for a genuinely missing column.
// Resetting both here makes a failed query present as "no row, no
// columns" - clean and consistent regardless of what ran before it
// on this session.
row = NULL;
qFields = 0;
fieldIndex.clear();
}
}
@@ -63,25 +209,51 @@ namespace jet {
if(column == "?#") {
nbrOfColumns = (int)qFields;
return nbrOfColumns;
} else if(column.ifNext("#")) {
} else if(column.ifNext("#") || column.ifNext("?")) {
// "#N"/"?N" (column name at 1-based position N) are the same
// jet-1.4 syntax under two different prefixes - real, unmodified
// 1.4 content uses both (barant.tag's own <showtable> definition
// writes $[?$[index]], never $[#$[index]]) - confirmed via a real
// repro: admin.page's own Users/Products tables rendered every
// column header and cell completely blank, since "?N" fell all
// the way through to the ordinary column-VALUE lookup below
// (nothing named "?3" exists in the row) and read as empty rather
// than as "the name of column 3", per the jet-1.4-fallback #2
// empty-string-on-missing-column behavior elsewhere in this
// codebase (see Tag.cpp).
if(column.eod()) {
nbrOfRows = (int)mysql_num_rows(result);
return nbrOfRows;
} else {
std::cout << "[" << column.unparsed() << "]" << std::endl;
int index = column.asInteger();
std::cout << "integer: " << index << std::endl;
field = mysql_fetch_field_direct(result, index - 1);
return coreutils::ZString(field->name);
}
}
for(int ix = 0; ix < qFields; ++ix) {
field = mysql_fetch_field_direct(result, ix);
if(column.equals((char *)field->name)) {
return coreutils::ZString(row[ix], fieldLength[ix]);
}
}
// A query that ran successfully but matched zero rows (a real,
// valid query - e.g. cart.page's own aggregate/JOIN query against
// an empty cart session - not a failed one, see query()'s own
// row=NULL/qFields=0 reset above for that separate case) leaves
// qFields correctly reflecting the real schema but `row` NULL.
// The loop below finds a genuine matching column name and then
// dereferences row[ix] - segfaulting (confirmed via gdb: SIGSEGV
// right here) instead of reaching a catchable error. Reusing the
// same "column does not exist" exception the loop's own fallthrough
// already throws - no current row means no column value is
// obtainable either way, and callers already expect and catch
// this exact exception.
if(!row)
throw coreutils::Exception("column does not exist in session result.");
// O(1) against the map query() already built for this result set,
// instead of re-deriving field metadata (mysql_fetch_field_direct,
// a real MySQL C API call) and string-comparing column names one
// by one on every single named access - see fieldIndex's own doc
// comment in __mysql.h for the full story.
auto it = fieldIndex.find(column.str());
if(it != fieldIndex.end())
return coreutils::ZString(row[it->second], fieldLength[it->second]);
throw coreutils::Exception("column does not exist in session result.");
}
+23 -5
View File
@@ -5,6 +5,8 @@
#include "ZString.h"
#include "MString.h"
#include <sstream>
#include <string>
#include <unordered_map>
#include <mysql/mysql.h>
namespace jet {
@@ -21,13 +23,29 @@ namespace jet {
coreutils::ZString getColumnValue(coreutils::ZString column);
private:
MYSQL *mysql;
MYSQL_RES *result;
MYSQL_ROW row;
unsigned long *fieldLength;
unsigned int qFields;
// Explicitly initialized - result/row/fieldLength were otherwise
// left as garbage stack values until query() first ran. A
// <mysql>...</mysql> block that connects successfully but never
// runs a <sql> query inside it (e.g. just a connectivity check)
// would previously reach ~__mysql()'s mysql_free_result(result)
// with an uninitialized pointer - real undefined behavior, found
// while root-causing a live crash in a related part of this same
// class's constructor.
MYSQL *mysql = NULL;
MYSQL_RES *result = NULL;
MYSQL_ROW row = NULL;
unsigned long *fieldLength = NULL;
unsigned int qFields = 0;
coreutils::MString sessionId;
// Column-name -> row[] index, built once per query() call (see its
// own comment) instead of getColumnValue() re-deriving it via a
// fresh mysql_fetch_field_direct() linear scan on every single
// named lookup - a template reading N columns off one row used to
// pay that scan N times over, even though the schema is fixed for
// the lifetime of one result set.
std::unordered_map<std::string, int> fieldIndex;
coreutils::MString nbrOfRows = "0";
coreutils::MString nbrOfColumns = "0";
+12 -2
View File
@@ -13,10 +13,20 @@ namespace jet {
output = false;
if(!hasContainer)
throw coreutils::Exception("sql tag must have a container.");
if(!global.sessionExists(keywords["sessionid"]))
// resolveKeyword("sessionid") already returns the resolved VALUE
// (e.g. "projman") - the query call below used to wrap that value
// back into keywords[...] as if it were a MAP KEY, auto-vivifying
// an empty string and silently running every <sql sessionid="X">
// query (X != "") against the DEFAULT session instead of the one
// actually named - same double-indirection bug already fixed in
// __mysql.cpp's own constructor (see its own comment on this).
// Resolved once into a local so both the existence check and the
// query call agree on the real, resolved session id.
coreutils::MString sessionId = resolveKeyword("sessionid");
if(!global.sessionExists(sessionId))
throw coreutils::Exception("sessionid does not exist.");
processContainer(container);
global.getSession(keywords[resolveKeyword("sessionid")])->query(out);
global.getSession(sessionId)->query(out);
}
}
+12 -3
View File
@@ -29,10 +29,19 @@ namespace jet {
Tag *scope = parent;
while(scope && !scope->isCustomTagBoundary)
scope = scope->parent;
// Custom tag NAMES are matched case-insensitively at invocation
// (findTagDefinition normalizes its own lookup key the same way),
// matching the precedent already set for built-in tag names
// (ifTagName) and attribute names - real 1.4 content declares and
// invokes a custom tag in different case at different sites (e.g.
// SESSIONCTL.tag's own <TAG NAME='TEMPLATE'> definition vs
// mainpagetemplate.temp's <template>...</template> invocation of
// it). Registering under the lowercase key here is what makes that
// match.
coreutils::MString tagName = coreutils::MString(keywords["name"]).toLower();
if(scope)
scope->localTags[keywords["name"]] = container;
scope->localTags[tagName] = container;
else
global.tags[keywords["name"]] = container;
global.tags[tagName] = container;
}
}
+2 -2
View File
@@ -21,7 +21,7 @@ namespace jet {
if(!keywordDefined("type"))
throw coreutils::Exception("type expected if value1 and value2 specified.");
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
@@ -50,7 +50,7 @@ namespace jet {
booleanResult = Operand(keywords["expr"], *this).boolean;
} else {
booleanResult = false;
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
+2 -2
View File
@@ -21,7 +21,7 @@ namespace jet {
if(!keywordDefined("type"))
throw coreutils::Exception("type expected if value1 and value2 specified.");
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
@@ -50,7 +50,7 @@ namespace jet {
booleanResult = Operand(keywords["expr"], *this).boolean;
} else {
booleanResult = false;
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
+81 -16
View File
@@ -9,35 +9,100 @@
namespace jet {
__whiledir::__whiledir(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
if(!keywordDefined("path"))
// Real 1.4 content (barantmusic.page/davidarant.page's own
// bae1996.section) writes <whiledir dir="..." name="filename">,
// not <whiledir path="..." filename="...">. Accept "dir" as an
// alias for "path" and "name" as an alias for "filename" so that
// content runs unmodified, matching the same "accept either"
// precedent already used for <database name=>/<mysql database=>.
// Resolved once into real local VALUES (not a dynamically-chosen
// keyword NAME threaded through repeated keywordDefined()/
// resolveKeyword() calls) - an earlier version of this fix passed
// a ZString holding just the chosen attribute name around and hit
// real, unexplained corruption (a whiledir on a real, correctly
// specified directory resolved to a garbage nonsense path instead).
// This form fixed it in isolation (a standalone whiledir_test.jet
// against this exact directory/attributes works perfectly) but the
// SAME garbage path still recurs when this exact content
// (bae1996.section) is reached through real content's actual deep
// <eval>/<dotag>/<include> nesting (40+ stack frames by that
// point) - genuinely not yet root-caused; flagged in project
// memory as still open. The try/catch below at least converts
// whatever throws there into the same graceful, catchable error
// page every other tag failure already gets, instead of a raw
// std::exception unwinding past everything and dropping the
// connection with no HTTP response at all.
coreutils::MString dirPath;
if(keywordDefined("path"))
dirPath = resolveKeyword("path");
else if(keywordDefined("dir"))
dirPath = resolveKeyword("dir");
else
throw coreutils::Exception("whiledir tag must specify a path.");
if(keywordDefined("sort") && (resolveKeyword("sort") == "true")) {
// Every one of these attributes - which output variable name to
// assign into for a given field, and whether that field was even
// requested - is a static property of this <whiledir> invocation,
// fixed at construction, never changing across its own loop. The
// per-iteration body used to call keywordDefined()+resolveKeyword()
// (2 map lookups each) for fullpath/filename/filenamenoextension
// on every single directory entry - resolved once here instead,
// same reasoning as __whilerow.cpp's session-pointer hoist.
coreutils::MString filenameVarName;
bool haveFilenameVar = false;
if(keywordDefined("filename")) {
filenameVarName = resolveKeyword("filename");
haveFilenameVar = true;
} else if(keywordDefined("name")) {
filenameVarName = resolveKeyword("name");
haveFilenameVar = true;
}
coreutils::MString fullpathVarName;
bool haveFullpathVar = keywordDefined("fullpath");
if(haveFullpathVar)
fullpathVarName = resolveKeyword("fullpath");
coreutils::MString noExtVarName;
bool haveNoExtVar = keywordDefined("filenamenoextension");
if(haveNoExtVar)
noExtVarName = resolveKeyword("filenamenoextension");
bool sorted = keywordDefined("sort") && (resolveKeyword("sort") == "true");
try {
if(sorted) {
std::vector<std::filesystem::directory_entry> entries;
for(auto const &entry : std::filesystem::directory_iterator(resolveKeyword("path").str()))
for(auto const &entry : std::filesystem::directory_iterator(dirPath.str()))
entries.push_back(entry);
std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b) { return a.path() < b.path(); });
for(const auto &entry : entries) {
if(keywordDefined("fullpath"))
global.variables[resolveKeyword("fullpath")] = entry.path();
if(keywordDefined("filename"))
global.variables[resolveKeyword("filename")] = entry.path().filename();
if(keywordDefined("filenamenoextension"))
global.variables[resolveKeyword("filenamenoextension")] = entry.path().stem();
if(haveFullpathVar)
global.variables[fullpathVarName] = entry.path();
if(haveFilenameVar)
global.variables[filenameVarName] = entry.path().filename();
if(haveNoExtVar)
global.variables[noExtVarName] = entry.path().stem();
processContainer(container);
container.reset();
}
} else {
for(auto const &entry : std::filesystem::directory_iterator(variables[resolveKeyword("path")].str())) {
if(keywordDefined("fullpath"))
global.variables[resolveKeyword("fullpath")] = entry.path();
if(keywordDefined("filename"))
global.variables[resolveKeyword("filename")] = entry.path().filename();
if(keywordDefined("filenamenoextension"))
global.variables[resolveKeyword("filenamenoextension")] = entry.path().stem();
for(auto const &entry : std::filesystem::directory_iterator(dirPath.str())) {
if(haveFullpathVar)
global.variables[fullpathVarName] = entry.path();
if(haveFilenameVar)
global.variables[filenameVarName] = entry.path().filename();
if(haveNoExtVar)
global.variables[noExtVarName] = entry.path().stem();
processContainer(container);
container.reset();
}
}
} catch(std::exception &e) {
coreutils::MString msg("whiledir failed: ");
msg << e.what();
throw coreutils::Exception(msg.str());
}
}
+22 -3
View File
@@ -7,12 +7,31 @@ namespace jet {
__whilerow::__whilerow(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
int count = keywords["count"].asInteger();
// A bare <whilerow> (no count= attribute at all - the overwhelming
// majority of real usage: modular1_patches.page, account.page,
// task.page, project.page, editinvoice.page, musicianhome.page,
// invoice.method, modular1_1_preset_admin.page) used to default
// count to 0 - keywords["count"] auto-vivifies an empty string for
// a missing attribute, and "".asInteger() is 0 - which made the
// loop's own (count != 0) condition false on the very first check,
// before hasRow() was ever even consulted. Every one of those
// pages' row-based content silently rendered nothing, for every
// request, this entire session - never caught because nothing
// that exercised a bare <whilerow> with real row data also had its
// actual rendered output inspected until now. count= is meant as
// an OPTIONAL cap ("show at most N rows"); absent, it must mean
// unlimited, not zero - -1 as a sentinel keeps working with the
// existing (count != 0) loop test forever (decrementing through
// negative numbers never hits 0), letting hasRow() alone decide
// when the loop ends, exactly as bare usage always intended.
int count = keywordDefined("count") ? keywords["count"].asInteger() : -1;
while ((count != 0) && global.getSession(keywords["sessionid"])->hasRow()) {
__mysql *session = global.getSession(resolveKeyword("sessionid"));
while((count != 0) && session->hasRow()) {
processContainer(container);
container.reset();
global.getSession(keywords["sessionid"])->nextRow();
session->nextRow();
--count;
}
+35 -5
View File
@@ -24,19 +24,49 @@ namespace jet {
throw coreutils::Exception("write tag must have a value, expr or a container.");
if(!keywordDefined("mode"))
throw coreutils::Exception("write tag must have a mode keyword.");
if(keywords[resolveKeyword("mode")] == "append")
// resolveKeyword("mode") already returns the resolved VALUE (e.g.
// "overwrite") - re-indexing keywords[...] with that value treats
// it as if it were a MAP KEY instead (auto-vivifying an empty
// string, since no keyword is literally named "overwrite"/
// "append"), so this comparison was false for every real input
// and <write> threw "mode keyword must be..." unconditionally.
// Same double-indirection bug already fixed elsewhere in this
// codebase (__mysql.cpp's own constructor, __sql.cpp's sessionid
// handling) - confirmed via a real repro building the jet-2.0
// htmleditor port's file-based storage.
coreutils::MString modeValue = resolveKeyword("mode");
if(modeValue == "append")
mode = O_APPEND;
else if(keywords[resolveKeyword("mode")] == "overwrite")
else if(modeValue == "overwrite")
mode = O_TRUNC;
else
throw coreutils::Exception("mode keyword must be 'overwrite' or 'append'.");
int fd = open(keywords[resolveKeyword("file")].c_str(), mode, 0644); // TODO: Need to add O_CREAT and AUTH flags.
// mode alone (O_APPEND or O_TRUNC) has no access-mode bits at
// all - open()'s access mode defaults to O_RDONLY (0) unless
// O_WRONLY/O_RDWR is explicitly OR'd in, so the write() call below
// was failing on every real invocation (EBADF - can't write a
// read-only fd), and without O_CREAT this could never create a
// NEW file either, only (theoretically) write an existing one.
// Confirmed via a real repro: <write file="..." mode="overwrite">
// silently produced a 0-byte or missing file every time.
// Same double-indirection bug as "mode" above.
int fd = open(resolveKeyword("file").c_str(), mode | O_WRONLY | O_CREAT, 0644); // TODO: Need to add AUTH flags.
if(hasContainer && !evaluate)
len = write(fd, container.getData(), container.getLength());
else if(hasContainer && evaluate)
len = write(fd, out.getData(), out.getLength());
else if(!hasContainer && keywordDefined("value"))
len = write(fd, variables[resolveKeyword("value")].getData(), keywords[resolveKeyword("value")].getLength());
else if(!hasContainer && keywordDefined("value")) {
// Same double-indirection bug as "mode"/"file" above:
// variables[resolveKeyword("value")] used the resolved VALUE
// itself as a lookup key into global.variables (a DIFFERENT map
// entirely), not the literal value to write - looking up a
// variable literally named e.g. "hello world" auto-vivifies an
// empty entry, so this wrote 0 bytes for every real invocation.
// Confirmed via a real repro: <write value="hello world"
// mode="overwrite"> produced a genuinely empty file.
coreutils::MString writeValue = resolveKeyword("value");
len = write(fd, writeValue.getData(), writeValue.getLength());
}
else if(!hasContainer && keywordDefined("expr"))
len = write(fd, keywords["expr"].getData(), keywords["expr"].getLength());
close(fd);
+19 -1
View File
@@ -8,7 +8,7 @@
namespace jetc {
enum class NodeKind {
TEXT, VAR, SET, IF, FOR, WHILE, FALLBACK
TEXT, VAR, SET, IF, FOR, WHILE, FALLBACK, TAGDEF, CONTAINER_SLOT
};
enum class CondMode { VALUES, EXPR };
@@ -55,6 +55,24 @@ namespace jetc {
std::string forScope;
std::vector<NodePtr> body; // also used by WHILE
// TAGDEF - a top-level <tag name="X">...</tag> custom-tag definition
// (only recognized at the file's true top level - see Parser::topLevel;
// one nested inside another tag's own definition body stays FALLBACK,
// unchanged). tagDefName is already lowercased, matching __tag.cpp's
// own registration key. tagDefBody is the compiled definition body
// (may itself contain CONTAINER_SLOT nodes for <container> markers,
// and FALLBACK leaves for anything still unsupported). rawSpan
// (shared with FALLBACK, below) still holds the exact original source
// text - codegen still emits the same raw interpretSpan-based
// registration into global.tags alongside the new compiled fast path,
// so anything that reaches this tag some other way keeps working
// exactly as it does today.
std::string tagDefName;
std::vector<NodePtr> tagDefBody;
// CONTAINER_SLOT - a <container> marker (see Tag::renderContainer) -
// a pure leaf, no extra fields.
// FALLBACK - exact original source text of one unsupported tag
std::string rawSpan;
};
+174 -104
View File
@@ -49,124 +49,181 @@ namespace jetc {
return expr.c_str();
}
void Codegen::emitBody(const std::vector<NodePtr> &nodes, int indent) {
for (auto &n : nodes) emitNode(n, indent);
void Codegen::emitBody(const std::vector<NodePtr> &nodes, int indent, std::ostringstream &target) {
for (auto &n : nodes) emitNode(n, indent, target);
}
void Codegen::emitNode(const NodePtr &n, int indent) {
void Codegen::emitNode(const NodePtr &n, int indent, std::ostringstream &target) {
std::string I = ind(indent);
switch (n->kind) {
case NodeKind::TEXT: {
if (n->text.empty()) break;
out << I << "out << " << cstr(n->text) << ";\n";
target << I << "out << " << cstr(n->text) << ";\n";
break;
}
case NodeKind::VAR: {
out << I << "{ coreutils::ZString v(" << cstr(n->varText) << "); out << scope.getVariable(v, true); }\n";
target << I << "{ coreutils::ZString v(" << cstr(n->varText) << "); out << scope.getVariable(v, true); }\n";
break;
}
case NodeKind::SET: {
std::string k = id("set_");
out << I << "{\n";
out << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->setName) << ";\n";
out << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->setScope) << ";\n";
out << I << " coreutils::MString val;\n";
target << I << "{\n";
target << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->setName) << ";\n";
target << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->setScope) << ";\n";
target << I << " coreutils::MString val;\n";
if (n->setHasExpr) {
out << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->setExpr) << ";\n";
out << I << " val = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).string;\n";
target << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->setExpr) << ";\n";
target << I << " val = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).string;\n";
} else {
out << I << " scope.keywords[\"" << k << "value\"] = " << cstr(n->setHasValue ? n->setValue : std::string()) << ";\n";
out << I << " val = scope.resolveKeyword(\"" << k << "value\");\n";
target << I << " scope.keywords[\"" << k << "value\"] = " << cstr(n->setHasValue ? n->setValue : std::string()) << ";\n";
target << I << " val = scope.resolveKeyword(\"" << k << "value\");\n";
}
out << I << " scope.assignVariable(scope.resolveKeyword(\"" << k << "name\"), val, scope.resolveKeyword(\"" << k << "scope\"));\n";
out << I << "}\n";
target << I << " scope.assignVariable(scope.resolveKeyword(\"" << k << "name\"), val, scope.resolveKeyword(\"" << k << "scope\"));\n";
target << I << "}\n";
break;
}
case NodeKind::IF: {
std::string k = id("if_");
out << I << "{\n";
out << I << " bool cond;\n";
target << I << "{\n";
target << I << " bool cond;\n";
if (n->cond.mode == CondMode::EXPR) {
out << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
out << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
target << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
target << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
} else {
out << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
out << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
out << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
out << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
target << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
target << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
target << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
target << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
}
out << I << " if (cond) {\n";
emitBody(n->thenBody, indent + 2);
target << I << " if (cond) {\n";
emitBody(n->thenBody, indent + 2, target);
if (n->hasElse) {
out << I << " } else {\n";
emitBody(n->elseBody, indent + 2);
target << I << " } else {\n";
emitBody(n->elseBody, indent + 2, target);
}
out << I << " }\n";
out << I << "}\n";
target << I << " }\n";
target << I << "}\n";
break;
}
case NodeKind::FOR: {
std::string k = id("for_");
out << I << "{\n";
out << I << " scope.keywords[\"" << k << "start\"] = " << cstr(n->forHasStart ? n->forStart : std::string("0")) << ";\n";
out << I << " scope.keywords[\"" << k << "end\"] = " << cstr(n->forEnd) << ";\n";
out << I << " scope.keywords[\"" << k << "step\"] = " << cstr(n->forStep) << ";\n";
out << I << " double ix = scope.resolveKeyword(\"" << k << "start\").asDouble();\n";
target << I << "{\n";
target << I << " scope.keywords[\"" << k << "start\"] = " << cstr(n->forHasStart ? n->forStart : std::string("0")) << ";\n";
target << I << " scope.keywords[\"" << k << "end\"] = " << cstr(n->forEnd) << ";\n";
target << I << " scope.keywords[\"" << k << "step\"] = " << cstr(n->forStep) << ";\n";
target << I << " double ix = scope.resolveKeyword(\"" << k << "start\").asDouble();\n";
if (n->forHasName) {
out << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->forName) << ";\n";
out << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->forScope) << ";\n";
target << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->forName) << ";\n";
target << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->forScope) << ";\n";
}
out << I << " for (; ix <= scope.resolveKeyword(\"" << k << "end\").asDouble(); ix += scope.resolveKeyword(\"" << k << "step\").asDouble()) {\n";
target << I << " for (; ix <= scope.resolveKeyword(\"" << k << "end\").asDouble(); ix += scope.resolveKeyword(\"" << k << "step\").asDouble()) {\n";
if (n->forHasName) {
out << I << " coreutils::MString nameSel = scope.resolveKeyword(\"" << k << "name\");\n";
out << I << " coreutils::MString scopeSel = scope.resolveKeyword(\"" << k << "scope\");\n";
out << I << " if ((scopeSel == \"\") || (scopeSel == \"global\")) global.variables[nameSel] = ix;\n";
out << I << " else if (scopeSel == \"local\") scope.local->variables[nameSel] = ix;\n";
out << I << " else if (scopeSel == \"parent\") scope.parent->local->variables[nameSel] = ix;\n";
out << I << " else throw coreutils::Exception(\"scope value is not valid.\");\n";
target << I << " coreutils::MString nameSel = scope.resolveKeyword(\"" << k << "name\");\n";
target << I << " coreutils::MString scopeSel = scope.resolveKeyword(\"" << k << "scope\");\n";
target << I << " if ((scopeSel == \"\") || (scopeSel == \"global\")) global.variables[nameSel] = ix;\n";
target << I << " else if (scopeSel == \"local\") scope.local->variables[nameSel] = ix;\n";
target << I << " else if (scopeSel == \"parent\") scope.parent->local->variables[nameSel] = ix;\n";
target << I << " else throw coreutils::Exception(\"scope value is not valid.\");\n";
}
emitBody(n->body, indent + 2);
out << I << " }\n";
out << I << "}\n";
emitBody(n->body, indent + 2, target);
target << I << " }\n";
target << I << "}\n";
break;
}
case NodeKind::WHILE: {
std::string k = id("while_");
out << I << "{\n";
out << I << " bool cond;\n";
target << I << "{\n";
target << I << " bool cond;\n";
if (n->cond.mode == CondMode::EXPR) {
out << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
out << I << " coreutils::MString exprSaved = scope.keywords[\"" << k << "expr\"];\n";
out << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
out << I << " while (cond) {\n";
emitBody(n->body, indent + 2);
out << I << " scope.keywords[\"" << k << "expr\"].reset();\n";
out << I << " scope.keywords[\"" << k << "expr\"] = exprSaved;\n";
out << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
out << I << " }\n";
target << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
target << I << " coreutils::MString exprSaved = scope.keywords[\"" << k << "expr\"];\n";
target << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
target << I << " while (cond) {\n";
emitBody(n->body, indent + 2, target);
target << I << " scope.keywords[\"" << k << "expr\"].reset();\n";
target << I << " scope.keywords[\"" << k << "expr\"] = exprSaved;\n";
target << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
target << I << " }\n";
} else {
out << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
out << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
out << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
out << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
out << I << " while (cond) {\n";
emitBody(n->body, indent + 2);
out << I << " int rc2 = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
out << I << " cond = (" << staticTypeOp(n->cond.type, "rc2") << ");\n";
out << I << " }\n";
target << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
target << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
target << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
target << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
target << I << " while (cond) {\n";
emitBody(n->body, indent + 2, target);
target << I << " int rc2 = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
target << I << " cond = (" << staticTypeOp(n->cond.type, "rc2") << ");\n";
target << I << " }\n";
}
out << I << "}\n";
target << I << "}\n";
break;
}
case NodeKind::FALLBACK: {
out << I << "{ coreutils::ZString span(" << cstr(n->rawSpan) << "); scope.interpretSpan(span, out); }\n";
target << I << "{ coreutils::ZString span(" << cstr(n->rawSpan) << "); scope.interpretSpan(span, out); }\n";
break;
}
case NodeKind::CONTAINER_SLOT: {
// Reuses the interpreter's own <container> scope-walking logic
// verbatim (see Tag::renderContainer) rather than re-deriving
// it - this is exactly what the runtime's own <container>
// dispatch does when it's reached via interpretSpan, just
// without the text-scanning step to get there.
target << I << "scope.renderContainer(out);\n";
break;
}
case NodeKind::TAGDEF: {
// Codegen can still fail for a node that parsed successfully -
// e.g. an <if>/<while> whose type= isn't one of eq/ne/lt/le/gt/ge
// (staticTypeOp's own check - real legacy content occasionally
// has one of these sitting in a branch that's never actually
// reached at runtime either, so there's nothing to "correctly"
// compile). Parsing this definition's body already succeeded
// (see parseTagDef's own try/catch for that stage) or this node
// wouldn't exist as TAGDEF at all - so mirror that same
// graceful-degradation approach here for the emit stage: try
// building the compiled function into a throwaway stream first,
// and only splice it into tagDefFuncs (and register the
// compiledTags fast path) if that fully succeeds. A failure
// here just means this one definition stays interpreted,
// unchanged - zero risk to the rest of the file.
std::string funcName = "jetc_tagdef_" + id("");
std::ostringstream trial;
bool compiledOk = true;
try {
trial << "static void " << funcName << "(jet::Tag &scope, coreutils::MString &out) {\n";
emitBody(n->tagDefBody, 1, trial);
trial << "}\n\n";
} catch (const std::exception &) {
compiledOk = false;
}
// Emitted in place, at this TAGDEF's original position in
// program flow - matches exactly what FALLBACK would have
// emitted for this same <tag name="X">...</tag> span, so
// global.tags["x"] still gets populated as before (needed as a
// correctness fallback: any invocation this compiler doesn't
// itself recognize - e.g. reached through content this pass
// never compiled - still resolves it exactly as it always has).
target << I << "{ coreutils::ZString span(" << cstr(n->rawSpan) << "); scope.interpretSpan(span, out); }\n";
if (compiledOk) {
// The registration into compiledTags right after is the only
// new behavior beyond the raw registration above - a pure
// additive fast path __dotag checks first (see __dotag.cpp);
// a miss there falls through to the now-unchanged interpreted
// path, which is exactly what happens when compiledOk is
// false here too.
tagDefFuncs << trial.str();
target << I << "global.compiledTags[coreutils::MString(" << cstr(n->tagDefName) << ")] = &" << funcName << ";\n";
}
break;
}
}
@@ -177,6 +234,9 @@ namespace jetc {
const std::vector<ApiRoute> &apiRoutes, const std::string &apiSymbol) {
out.str("");
out.clear();
tagDefFuncs.str("");
tagDefFuncs.clear();
out << "// " << sourceFileComment << "\n";
out << "// Generated by jetc - DO NOT EDIT BY HAND.\n";
out << "#include \"Global.h\"\n";
@@ -187,51 +247,61 @@ namespace jetc {
out << "#include \"Exception.h\"\n";
out << "#include <iostream>\n\n";
// The entry function's own text is built into a separate stream so
// tagDefFuncs - populated as a SIDE EFFECT of the emitBody() call
// below, since TAGDEF nodes append to it as they're encountered -
// can be spliced in ahead of it. A compiled tag-definition function
// never needs to be forward-declared for anything defined before it
// in program order (nothing upstream calls it directly - see
// __dotag.cpp's runtime lookup instead), so this ordering is purely
// for readability, not a correctness requirement.
std::ostringstream body;
if (sharedMode) {
if (!apiRoutes.empty()) {
// A plain C struct, not any CoreUtils/JetCore type - this is the
// one piece of the plugin ABI a host loader needs to know about
// independent of the rest of this same-ABI C++ boundary.
out << "struct JetApiRoute { const char *method; const char *path; };\n";
out << "extern \"C\" const JetApiRoute *" << apiSymbol << "(int *count) {\n";
out << " static const JetApiRoute routes[] = {\n";
body << "struct JetApiRoute { const char *method; const char *path; };\n";
body << "extern \"C\" const JetApiRoute *" << apiSymbol << "(int *count) {\n";
body << " static const JetApiRoute routes[] = {\n";
for (auto &r : apiRoutes)
out << " { " << cstr(r.method) << ", " << cstr(r.path) << " },\n";
out << " };\n";
out << " *count = " << apiRoutes.size() << ";\n";
out << " return routes;\n";
out << "}\n\n";
body << " { " << cstr(r.method) << ", " << cstr(r.path) << " },\n";
body << " };\n";
body << " *count = " << apiRoutes.size() << ";\n";
body << " return routes;\n";
body << "}\n\n";
}
out << "extern \"C\" void " << entrySymbol << "(jet::Global &global, coreutils::MString &out) {\n";
out << " coreutils::ZString jetc_empty(\"\");\n";
out << " coreutils::MString jetc_scopeOut;\n";
out << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
emitBody(top, 1);
out << "}\n";
return out.str();
body << "extern \"C\" void " << entrySymbol << "(jet::Global &global, coreutils::MString &out) {\n";
body << " coreutils::ZString jetc_empty(\"\");\n";
body << " coreutils::MString jetc_scopeOut;\n";
body << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
emitBody(top, 1, body);
body << "}\n";
return out.str() + tagDefFuncs.str() + body.str();
}
out << "static void jetc_render(jet::Global &global, coreutils::MString &out) {\n";
out << " coreutils::ZString jetc_empty(\"\");\n";
out << " coreutils::MString jetc_scopeOut;\n";
out << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
emitBody(top, 1);
out << "}\n\n";
out << "int main(int argc, char **argv, char **envp) {\n";
out << " jet::Global global(envp);\n";
out << " coreutils::MString out;\n";
out << " try {\n";
out << " jetc_render(global, out);\n";
out << " global.outputHeaders();\n";
out << " std::cout << out;\n";
out << " } catch(coreutils::Exception e) {\n";
out << " std::cout << out;\n";
out << " std::cout << \"\\n----- Error: \" << e.text << std::endl;\n";
out << " return 1;\n";
out << " }\n";
out << " return 0;\n";
out << "}\n";
return out.str();
body << "static void jetc_render(jet::Global &global, coreutils::MString &out) {\n";
body << " coreutils::ZString jetc_empty(\"\");\n";
body << " coreutils::MString jetc_scopeOut;\n";
body << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
emitBody(top, 1, body);
body << "}\n\n";
body << "int main(int argc, char **argv, char **envp) {\n";
body << " jet::Global global(envp);\n";
body << " coreutils::MString out;\n";
body << " try {\n";
body << " jetc_render(global, out);\n";
body << " global.outputHeaders();\n";
body << " std::cout << out;\n";
body << " } catch(coreutils::Exception e) {\n";
body << " std::cout << out;\n";
body << " std::cout << \"\\n----- Error: \" << e.text << std::endl;\n";
body << " return 1;\n";
body << " }\n";
body << " return 0;\n";
body << "}\n";
return out.str() + tagDefFuncs.str() + body.str();
}
}
+19 -2
View File
@@ -62,11 +62,28 @@ namespace jetc {
private:
std::ostringstream out;
// Free functions generated for compiled <tag name="X"> definitions
// (see the TAGDEF case in emitNode) accumulate here, in the order
// encountered, and are spliced into the final output ahead of the
// entry function (see generate()) - C++ doesn't care about
// definition order within one translation unit as long as nothing
// outside of it needs a forward declaration, but keeping them
// grouped together ahead of the entry point makes the generated
// file easier to read/debug than interleaving them positionally.
std::ostringstream tagDefFuncs;
size_t nextId = 0;
std::string id(const std::string &prefix) { return prefix + std::to_string(nextId++) + "_"; }
void emitBody(const std::vector<NodePtr> &nodes, int indent);
void emitNode(const NodePtr &n, int indent);
// target is the stream this node's statements are written to - `out`
// for everything at the top level or nested inside ordinary control
// flow (IF/FOR/WHILE bodies stay in the same stream as their
// enclosing scope), but a TAGDEF's own body is rendered into a
// fresh stream to become a separate generated function (see
// emitNode's TAGDEF case) rather than being inlined in place.
void emitBody(const std::vector<NodePtr> &nodes, int indent, std::ostringstream &target);
void emitNode(const NodePtr &n, int indent, std::ostringstream &target);
static std::string ind(int indent);
static std::string cstr(const std::string &raw); // C++ string-literal escape
static const char *staticTypeOp(const std::string &type, const char *rcVar);
+295 -26
View File
@@ -1,6 +1,11 @@
#include "JetParser.h"
#include <cctype>
#include <stdexcept>
#include <set>
#include <cstdio>
#include <fstream>
#include <sstream>
#include <cstdio>
namespace jetc {
@@ -29,37 +34,148 @@ namespace jetc {
return s.substr(start, p - start);
}
namespace {
// jet-1.4 (the language this parser also has to accept, alongside
// real 2.0 source) was fully case-insensitive on tag names - the
// production source mixes case freely, even within one tag's own
// body (e.g. <SET ...> and <set ...> side by side). Tag names are
// matched case-insensitively throughout this parser for that
// reason; nothing else (attribute values, text content) is
// affected by this helper.
bool ciEquals(const char *a, size_t alen, const std::string &b) {
if (alen != b.size()) return false;
for (size_t i = 0; i < alen; i++)
if (std::tolower((unsigned char)a[i]) != std::tolower((unsigned char)b[i]))
return false;
return true;
}
}
bool Parser::matchTagOpen(const std::string &name, size_t at) const {
if (s.compare(at, 1, "<") != 0) return false;
size_t p = at + 1;
size_t nstart = p;
while (p < s.size() && isNameChar(s[p])) p++;
if (s.compare(nstart, p - nstart, name) != 0) return false;
if (!ciEquals(s.data() + nstart, p - nstart, name)) return false;
if (p >= s.size()) return false;
char c = s[p];
return c == ' ' || c == '>' || c == '/';
}
bool Parser::matchTagClose(const std::string &name, size_t at) const {
std::string closer = "</" + name + ">";
return s.compare(at, closer.size(), closer) == 0;
if (s.compare(at, 2, "</") != 0) return false;
size_t p = at + 2;
size_t nstart = p;
while (p < s.size() && isNameChar(s[p])) p++;
if (!ciEquals(s.data() + nstart, p - nstart, name)) return false;
return p < s.size() && s[p] == '>';
}
bool Parser::skipOpenTag(size_t &p) const {
namespace {
// jet-1.4's real parser knew which tags never take a body (its own
// "void element" list) - kept here, ahead of skipOpenTag/
// skipEmbeddedTag/parseFallback, since all of them need it.
bool isVoidTag(const std::string &name) {
static const std::set<std::string> voidTags = {
// jet's own built-ins that never take a body. exclude is
// NOT here - __exclude.cpp's own constructor requires a
// real body (throws "exclude must have a container"
// otherwise), it was previously miscategorized as void.
"set", "include", "cookie", "header", "read", "write",
"call", "system", "dump",
// <container> (see parseContainerSlot/Tag::renderContainer) -
// real content always writes it as a bare marker with no
// separate closing tag, even when it carries its own
// attributes (e.g. SESSIONCTL.tag's own
// <CONTAINER EVAL="NO">) - without this it was previously only
// reachable via the generic FALLBACK path (scanBody would
// incorrectly scan forward for a "</container>" that never
// exists, consuming unrelated following content).
"container",
// standard HTML5 void elements - real 1.4-era content (e.g.
// SESSIONCTL.tag) writes these the classic HTML way too,
// bare '>' and never a closing tag.
"br", "img", "input", "hr", "meta", "link", "area", "base",
"col", "embed", "source", "track", "wbr",
// <else> is a marker inside an <if>/<while>/<until> body
// (scanBody's own lookForElse handles it at the top level) -
// it never has its own close tag, so when it shows up
// embedded (inside a quoted attribute or another tag's
// attribute region, same as <if> does in <linkbutton>) it
// needs the same void treatment.
"else"
};
std::string lower = name;
for (char &c : lower) c = (char)std::tolower((unsigned char)c);
return voidTags.count(lower) != 0;
}
}
// Real 1.4 content nests real jet tags in two places a plain
// quote/angle-bracket scanner can't handle on its own:
// 1. Inside a quoted attribute value - SESSIONCTL.tag's <linkbutton>
// has HREF="javascript: <IF VALUE1="..." VALUE2="" TYPE=NE> ...
// </IF> ... " - the outer string and the embedded tag's own
// attributes reuse the same quote character with no escaping.
// 2. Inside another tag's OWN opening-tag attribute region, before
// its closing '>' - linkbutton's <A ...> has a conditional
// <if value1="#[CLASS]" value2="" type="ne">CLASS="#[CLASS]"</if>
// sitting between its other attributes and its own '>' - the
// literal '>' that ends the embedded <if ...>'s OWN opening tag
// would otherwise be mistaken for <A>'s closing '>'.
// skipEmbeddedTag() skips one such nested tag as a whole unit -
// its own attributes (recursing through skipOpenTag, so an embedded
// tag's embedded tag works too) and, if it isn't a void tag and wasn't
// self-closed, its real body up through its own matching close tag
// (via the same matchTagOpen/matchTagClose depth-tracking scanBody
// uses at the top level). skipOpenTag's own attribute scan and
// skipQuotedValue both call this for anything that looks like a
// nested tag, instead of treating it as ordinary content.
void Parser::skipEmbeddedTag(size_t &p) {
size_t nameStart = p + 1;
size_t nameEnd = nameStart;
while (nameEnd < s.size() && isNameChar(s[nameEnd])) nameEnd++;
std::string tagName = s.substr(nameStart, nameEnd - nameStart);
bool selfClosing = skipOpenTag(p);
if (!selfClosing && !isVoidTag(tagName)) {
auto span = scanBody(p, tagName, false);
p = span.first + 3 + tagName.size();
}
}
void Parser::skipQuotedValue(size_t &p) {
p++; // opening '"'
while (p < s.size()) {
if (s[p] == '"') { p++; return; }
if (s[p] == '\\' && p + 1 < s.size()) { p += 2; continue; }
if (s[p] == '<' && p + 1 < s.size() && isNameChar(s[p + 1])) {
skipEmbeddedTag(p);
continue;
}
if (s[p] == '<' && s.compare(p, 2, "</") == 0) {
p += 2;
while (p < s.size() && isNameChar(s[p])) p++;
if (p < s.size() && s[p] == '>') p++;
continue;
}
p++;
}
}
bool Parser::skipOpenTag(size_t &p) {
p++; // '<'
while (p < s.size() && isNameChar(s[p])) p++;
while (p < s.size()) {
if (s[p] == '"') {
p++;
while (p < s.size() && s[p] != '"') {
if (s[p] == '\\' && p + 1 < s.size()) p++;
p++;
}
if (p < s.size()) p++;
skipQuotedValue(p);
continue;
}
if (s.compare(p, 2, "/>") == 0) { p += 2; return true; }
if (s[p] == '>') { p += 1; return false; }
if (s[p] == '<' && p + 1 < s.size() && isNameChar(s[p + 1])) {
skipEmbeddedTag(p);
continue;
}
p++;
}
throw std::runtime_error("jetc: unterminated tag near end of input");
@@ -74,14 +190,40 @@ namespace jetc {
if (starts(">")) { pos += 1; hasContainer = true; break; }
std::string aname = readName();
if (aname.empty()) throw std::runtime_error("jetc: malformed attribute near offset " + std::to_string(pos));
if (starts("=\"")) {
pos += 2;
if (starts("=")) {
pos += 1;
std::string val;
if (!eof() && s[pos] == '"') {
pos++;
while (!eof() && s[pos] != '"') {
if (s[pos] == '\\' && pos + 1 < s.size()) { val += s[pos]; val += s[pos + 1]; pos += 2; continue; }
val += s[pos++];
}
if (!eof()) pos++; // closing quote
} else if (!eof() && s[pos] == '\'') {
// Single-quoted value - real 1.4 content writes both
// (SESSIONCTL.tag's own name='tmp_#[name]' alongside
// ordinary name="..." elsewhere in the same file).
pos++;
while (!eof() && s[pos] != '\'') {
if (s[pos] == '\\' && pos + 1 < s.size()) { val += s[pos]; val += s[pos + 1]; pos += 2; continue; }
val += s[pos++];
}
if (!eof()) pos++; // closing quote
} else {
// Unquoted bareword value - real 1.4 content writes this
// too (type=eq, format=tobrowser, TYPE=NE throughout
// SESSIONCTL.tag) - the runtime interpreter's own
// attribute scanning already tolerates it; jetc's own
// parser previously didn't, since nothing had ever
// recursively parsed a tag definition's own body deeply
// enough to reach one before (see parseTagDef). Runs to
// the next whitespace or the tag's own closing '>'/'/>' .
while (!eof() && !std::isspace((unsigned char)s[pos]) && s[pos] != '>' &&
!(s[pos] == '/' && pos + 1 < s.size() && s[pos + 1] == '>')) {
val += s[pos++];
}
}
attrs[aname] = val;
}
}
@@ -126,7 +268,40 @@ namespace jetc {
}
std::vector<NodePtr> Parser::parseSub(size_t start, size_t end) {
Parser sub(s.substr(start, end - start));
// Always topLevel=false - an <if>/<for>/<while> body is never the
// file's true top level, regardless of what topLevel this Parser
// itself was constructed with (see parseTagDef/isVoidTag's doc
// comments - a <tag name="X"> found here stays FALLBACK, unchanged).
Parser sub(s.substr(start, end - start), baseDir, includeDepth, false);
return sub.parseNodes();
}
std::vector<NodePtr> Parser::parseInclude() {
pos += 8; // "<include"
bool hasContainer;
// <include> is always void, the same way <set> is (see parseSet) -
// real content writes it bare (<include file="X">, no explicit
// '/>'), which parseAttrs reports as hasContainer=true since it
// can't tell that apart from a real container tag on syntax alone.
auto attrs = parseAttrs(hasContainer);
(void)hasContainer;
auto it = attrs.find("file");
if (it == attrs.end())
throw std::runtime_error("jetc: <include> must have a file attribute.");
if (includeDepth > 32)
throw std::runtime_error("jetc: <include> depth exceeded (possible include cycle) resolving " + it->second);
std::string fullPath = baseDir.empty() ? it->second : baseDir + "/" + it->second;
std::ifstream in(fullPath);
if (!in)
throw std::runtime_error("jetc: <include> cannot open " + fullPath);
std::ostringstream ss;
ss << in.rdbuf();
// Inherits the includer's own topLevel - an <include> spliced in at
// the file's true top level reads as if its content were written
// inline there (see this method's own doc comment), so a <tag
// name="X"> defined in the included file is just as eligible for
// compilation as one written directly in the includer.
Parser sub(ss.str(), baseDir, includeDepth + 1, topLevel);
return sub.parseNodes();
}
@@ -146,21 +321,19 @@ namespace jetc {
}
NodePtr Parser::parseSet() {
size_t origStart = pos;
pos += 4; // "<set"
bool hasContainer;
auto attrs = parseAttrs(hasContainer);
if (hasContainer) {
// Container-form <set> (value comes from rendering nested content)
// isn't modeled by this prototype - fall back to full interpretation
// of the whole tag instead of failing to compile.
auto span = scanBody(pos, "set", false);
pos = span.first + 3 + 3; // "</set>"
auto n = std::make_shared<Node>();
n->kind = NodeKind::FALLBACK;
n->rawSpan = s.substr(origStart, pos - origStart);
return n;
}
// jet-1.4's <set name=... value=... expr=...> is always a plain
// attribute-based assignment - it never had a container/body form.
// Real 1.4 content (config.cfg, SESSIONCTL.tag, throughout) writes
// it with a bare closing '>' and no explicit </set>, which is
// syntactically indistinguishable from a (speculative, and per the
// comment this replaced, never actually implemented) 2.0
// container-form <set>...</set>. Since the container form was never
// real to begin with, <set> is always treated as self-closing here,
// matching 1.4's actual, exclusive behavior rather than guessing.
(void)hasContainer;
auto n = std::make_shared<Node>();
n->kind = NodeKind::SET;
n->setName = attrs.count("name") ? attrs["name"] : "";
@@ -246,7 +419,7 @@ namespace jetc {
std::string tagName = peekTagName(pos);
size_t p = pos;
bool selfClosing = skipOpenTag(p);
if (!selfClosing) {
if (!selfClosing && !isVoidTag(tagName)) {
auto span = scanBody(p, tagName, false);
p = span.first + 3 + tagName.size();
}
@@ -257,6 +430,94 @@ namespace jetc {
return n;
}
NodePtr Parser::parseTagDef() {
size_t origStart = pos;
pos += 4; // "<tag"
bool hasContainer;
auto attrs = parseAttrs(hasContainer);
std::string name = attrs.count("name") ? attrs["name"] : "";
// A dynamic name ($[...]/#[...]) or a body-less definition can't be
// (and, per __tag.cpp, isn't even valid as) a compiled definition -
// fall back to the exact same FALLBACK behavior as before rather
// than failing to compile. Real content always uses a literal name.
bool dynamicName = name.find("$[") != std::string::npos || name.find("#[") != std::string::npos;
if (!hasContainer || name.empty() || dynamicName) {
if (hasContainer) {
auto span = scanBody(pos, "tag", false);
pos = span.first + 3 + 3; // "</tag>"
}
auto n = std::make_shared<Node>();
n->kind = NodeKind::FALLBACK;
n->rawSpan = s.substr(origStart, pos - origStart);
return n;
}
std::string lowerName = name;
for (char &c : lowerName) c = (char)std::tolower((unsigned char)c);
auto span = scanBody(pos, "tag", false);
size_t closePos = span.first;
size_t afterClose = closePos + 3 + 3; // "</tag>"
// Best-effort: this compiler's own modeled grammar is a real subset
// of what the runtime interpreter tolerates (jet-1.4 content is
// lenient in ways this parser doesn't fully cover yet - e.g. a
// completely unrecognized bare tag like SESSIONCTL.tag's own
// <setcookie ...>, which the interpreter just echoes as literal
// text rather than treating as a real tag needing a close - see
// Tag.cpp's own final dispatch fallback). Rather than teach every
// such case to this parser up front, fall all the way back to the
// exact same FALLBACK behavior a pre-TAGDEF compiler would have
// produced for this whole span whenever the body can't be parsed -
// this tag definition simply isn't compiled (stays fully
// interpreted, unchanged), with zero risk to anything else in the
// file. pos is never mutated by the failed parseSub call itself
// (it operates on its own copied substring), so no explicit
// rewind is needed before falling through.
std::vector<NodePtr> body;
bool bodyOk = true;
try {
body = parseSub(pos, closePos);
} catch (const std::exception &) {
bodyOk = false;
}
if (!bodyOk) {
pos = afterClose;
auto n = std::make_shared<Node>();
n->kind = NodeKind::FALLBACK;
n->rawSpan = s.substr(origStart, pos - origStart);
return n;
}
pos = afterClose;
auto n = std::make_shared<Node>();
n->kind = NodeKind::TAGDEF;
n->tagDefName = lowerName;
n->tagDefBody = body;
// Exact original source text - codegen still emits the same
// interpretSpan-based raw registration into global.tags alongside
// the new compiled fast path (see JetCodegen's TAGDEF case), so
// anything that reaches this tag some other way (a nested/locally-
// scoped definition shadowing it, or interpreted content elsewhere)
// keeps working exactly as it does today.
n->rawSpan = s.substr(origStart, pos - origStart);
return n;
}
NodePtr Parser::parseContainerSlot() {
pos += 10; // "<container"
bool hasContainer;
auto attrs = parseAttrs(hasContainer);
// Attributes on <container> (eval=/name=/scope=, as real content
// sometimes writes) are not consulted by the interpreter's own
// <container> dispatch branch either (see Tag::renderContainer) -
// matching that exactly rather than inventing new behavior here.
(void)attrs;
(void)hasContainer;
auto n = std::make_shared<Node>();
n->kind = NodeKind::CONTAINER_SLOT;
return n;
}
std::vector<NodePtr> Parser::parseNodes() {
std::vector<NodePtr> nodes;
std::string textBuf;
@@ -287,6 +548,14 @@ namespace jetc {
if (matchTagOpen("if", pos)) { flush(); nodes.push_back(parseIf()); continue; }
if (matchTagOpen("for", pos)) { flush(); nodes.push_back(parseFor()); continue; }
if (matchTagOpen("while", pos)) { flush(); nodes.push_back(parseWhile()); continue; }
if (matchTagOpen("include", pos)) {
flush();
auto included = parseInclude();
nodes.insert(nodes.end(), included.begin(), included.end());
continue;
}
if (matchTagOpen("container", pos)) { flush(); nodes.push_back(parseContainerSlot()); continue; }
if (topLevel && matchTagOpen("tag", pos)) { flush(); nodes.push_back(parseTagDef()); continue; }
flush();
nodes.push_back(parseFallback());
continue;
+43 -2
View File
@@ -21,7 +21,19 @@ namespace jetc {
// gracefully instead of failing to compile.
class Parser {
public:
explicit Parser(const std::string &src) : s(src), pos(0) {}
// topLevel is false for any nested sub-parse (an <if>/<for>/<while>
// body, via parseSub) and true for the file's own top-level flow and
// for anything spliced in from an <include> (which inherits the
// includer's own topLevel, since it's meant to read as if written
// inline at that point - see parseInclude). Only used to decide
// whether a <tag name="X"> definition is eligible for compilation
// (see parseTagDef) - one found at topLevel==false (nested inside
// another construct) stays FALLBACK, unchanged, matching __tag.cpp's
// own locally-scoped-registration semantics that only a true
// top-level definition is guaranteed to always be registered by the
// time any invocation could reach it.
explicit Parser(const std::string &src, std::string baseDir = "", int includeDepth = 0, bool topLevel = true)
: s(src), pos(0), baseDir(baseDir), includeDepth(includeDepth), topLevel(topLevel) {}
std::vector<NodePtr> parseNodes();
@@ -29,6 +41,9 @@ namespace jetc {
std::string s;
size_t pos;
size_t nextId = 0;
std::string baseDir;
int includeDepth;
bool topLevel;
bool eof() const { return pos >= s.size(); }
bool starts(const std::string &lit) const;
@@ -42,7 +57,9 @@ namespace jetc {
// p points at '<' of some tag's opening; advances p past its '>' or
// "/>", skipping quoted attribute values. Returns true if self-closing.
bool skipOpenTag(size_t &p) const;
bool skipOpenTag(size_t &p);
void skipQuotedValue(size_t &p);
void skipEmbeddedTag(size_t &p);
std::map<std::string, std::string> parseAttrs(bool &hasContainer);
@@ -54,6 +71,15 @@ namespace jetc {
std::vector<NodePtr> parseSub(size_t start, size_t end);
// <include file="..."> is spliced in at compile time - read the
// referenced file (resolved relative to baseDir) and parse ITS
// content as if it had been written inline here, so everything in
// it (custom <tag> definitions included) goes through this real
// compiler, not the separate runtime interpreter (which has its own,
// independently-buggy nested-tag handling). Returns the parsed nodes
// to be spliced into the caller's own node list.
std::vector<NodePtr> parseInclude();
NodePtr parseVar();
NodePtr parseSet();
NodePtr parseIf();
@@ -61,6 +87,21 @@ namespace jetc {
NodePtr parseWhile();
NodePtr parseFallback();
// <tag name="X">...</tag> at true top level (see topLevel above) -
// compiles the definition body with a nested (topLevel=false) parse
// instead of falling back to raw text, so jetc can generate a real
// render function for it (see JetCodegen). Falls back to an ordinary
// FALLBACK node (same as today) if the definition has no container
// or no literal name= - degrades gracefully rather than failing to
// compile.
NodePtr parseTagDef();
// <container> (any case/attributes/closing style, always void - see
// isVoidTag) - a leaf node; the actual rendering logic lives in
// Tag::renderContainer, called from generated code exactly as the
// interpreter's own <container> dispatch calls it today.
NodePtr parseContainerSlot();
std::string newId(const std::string &prefix) { return prefix + std::to_string(nextId++) + "_"; }
};
-24
View File
@@ -1,24 +0,0 @@
.controlframe {background: #888;
padding: 5px 5px 15px 10px;
}
.vm {position: relative;
height: 55px;
}
.vmname {position: absolute;
left: 0px; top: 0px;
height: 55px;
}
.vmcover {position: absolute;
left: 15px;
top: 30px;
font: 12px 'Dot Matrix';
background: #bbb;
color: white;
border: 1pt solid white;
border-radius: 5px;
padding: 2px 10px 2px 10px;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

@@ -0,0 +1,26 @@
.controlframe {background: #16161c;
border: 1px solid rgba(197, 164, 90, 0.28);
border-radius: 3px;
padding: 5px 5px 15px 10px;
}
.vm {position: relative;
height: 55px;
}
.vmname {position: absolute;
left: 0px; top: 0px;
height: 55px;
}
.vmcover {position: absolute;
left: 15px;
top: 30px;
font: 12px 'Dot Matrix';
background: #101014;
color: #e3c47e;
border: 1px solid rgba(197, 164, 90, 0.4);
border-radius: 5px;
padding: 2px 10px 2px 10px;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

+690
View File
@@ -0,0 +1,690 @@
.rotate {
animation: rotation 1s infinite linear;
}
@keyframes rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(359deg);
}
}
@font-face {
font-family: avenir;
src: url('https://barant.com/fonts/AvenirLTStd-Light.ttf');
}
@font-face {
font-family: source;
src: url('https://barant.com/fonts/jackinput.TTF');
}
@font-face {
font-family: exo2;
src: url('https://barant.com/fonts/Exo2-RegularCondensed.otf');
}
:root {
--bond-bg: #0a0a0d;
--bond-bg-2: #131318;
--bond-panel: #16161c;
--bond-panel-2: #1c1c24;
--bond-line: rgba(197, 164, 90, 0.28);
--bond-line-soft: rgba(255, 255, 255, 0.07);
--bond-gold: #c5a45a;
--bond-gold-bright: #e3c47e;
--bond-ice: #6fb8c9;
--bond-text: #e7e4dc;
--bond-text-dim: #8d8c92;
--bond-red: #a13a3a;
}
* { box-sizing: border-box; }
body {
background: radial-gradient(ellipse at top, #1a1a20 0%, #0a0a0d 60%, #060607 100%);
background-attachment: fixed;
font-family: exo2;
color: var(--bond-text);
margin: 10px 10px 10px 10px;
width: 98%;
}
a:link, a:visited { text-decoration: none; color: var(--bond-gold); }
a:hover { text-decoration: none; color: var(--bond-gold-bright); }
h1 {
font: 20pt exo2;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--bond-text);
text-shadow: 0 0 0.6em rgba(197, 164, 90, 0.25);
opacity: 0.95;
}
h2 {
font: 14pt exo2;
letter-spacing: 0.06em;
color: var(--bond-gold-bright);
}
h3 {
font: 12pt exo2;
letter-spacing: 0.05em;
color: var(--bond-text);
}
p { font-family: 8pt exo2; color: var(--bond-text); }
ul { font-family: 8pt exo2; }
li { font-family: 8pt exo2; color: var(--bond-text); }
.project_header {
background: linear-gradient(180deg, #1c1c24, #101014);
color: var(--bond-gold-bright);
padding: 5px;
font-weight: 400;
font-size: 14px;
border-bottom: 1px solid var(--bond-line);
}
.pageclass {
background: var(--bond-bg-2);
border-radius: 6px;
border: 1px solid var(--bond-line);
box-shadow: 0 0 0 1px rgba(0,0,0,0.6), 0 20px 60px rgba(0,0,0,0.65);
border-spacing: 0px;
padding: 0px;
max-width: 1050px;
min-width: 1050px;
margin: auto;
font-family: exo2;
font-size: 10pt;
color: var(--bond-text);
overflow: hidden;
}
input {
background: #101014;
color: var(--bond-text);
border: 1px solid var(--bond-line-soft);
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 6px;
border-radius: 2px;
}
input:focus {
border-color: var(--bond-gold);
box-shadow: 0 0 0 1px rgba(197, 164, 90, 0.35);
}
select {
background: #101014;
color: var(--bond-text);
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
border: 1px solid var(--bond-line-soft);
padding: 1px 2px 1px 2px;
border-radius: 2px;
}
textarea.fieldinput {
background: #101014;
color: var(--bond-text);
resize: none;
font-family: exo2;
border: 1px solid var(--bond-line-soft);
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
border-radius: 2px;
}
textarea.fieldinputerror {
background: #241213;
color: var(--bond-text);
resize: none;
font-family: exo2;
border: 1px solid var(--bond-red);
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
border-radius: 2px;
}
.sectionframe {
position: relative;
font-family: exo2;
border: 1px solid var(--bond-line-soft);
font-size: 10pt;
margin: 3px;
background: var(--bond-panel);
padding: 0px;
border-radius: 3px;
}
.sectionframe:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 1px;
background: var(--bond-line);
}
.sectionframecontents {
padding: 10px;
text-align: justify;
color: var(--bond-text);
border-top: 1px solid var(--bond-line-soft);
background-color: var(--bond-panel);
}
.sectionframeheading {
background: linear-gradient(180deg, #1c1c24, #131318);
color: var(--bond-gold-bright);
border-bottom: 1px solid var(--bond-line);
vertical-align: middle;
padding: 6px 10px;
margin: 0px;
font-family: 12pt avenir;
letter-spacing: 0.08em;
text-transform: uppercase;
font-size: 10pt;
border-radius: 3px 3px 0px 0px;
}
.sectionframeheading2 {
background: var(--bond-panel-2);
color: var(--bond-gold-bright);
font-family: exo2;
font-size: 20pt;
letter-spacing: 0.06em;
padding: 3px;
border-radius: 3px;
}
.heading {
background: linear-gradient(180deg, #131318, #0d0d10);
border-radius: 5px 5px 0px 0px;
border-bottom: 1px solid var(--bond-line);
max-height: 80px;
}
.entryform {
background: #232330;
padding: 6px;
margin: 0px;
border: 1px solid rgba(197, 164, 90, 0.5);
border-radius: 3px;
}
.entryform table {
font: 12px exo2;
background: transparent;
border: 0pt solid black;
color: var(--bond-text);
}
.footer {
background: linear-gradient(180deg, #0a0a0d, #000);
border-top: 1px solid var(--bond-line);
font: 8pt verdana;
letter-spacing: 0.05em;
color: var(--bond-gold);
text-align: center;
padding: 6px 0;
border-radius: 0px 0px 5px 5px;
}
.menubar {
background: #0a0a0d;
border-bottom: 1px solid var(--bond-line);
padding: 0px 0px 0px 0px;
margin: 0px;
}
.baritem {
background: transparent;
color: var(--bond-text-dim);
position: relative;
font-family: exo2;
font-weight: 600;
letter-spacing: 0.06em;
font-size: 8pt;
padding: 6px 10px;
margin: 6px 0px 0px 0px;
border: none;
border-bottom: 2px solid transparent;
border-radius: 0px;
transition: color 0.25s ease, border-color 0.25s ease;
}
.baritem:after{
content: none;
}
.baritemselected {
/* Deliberately styled to read as the same surface as the content
panel it opens into (matching background, gold border wrapping
only the top/sides) - the open bottom edge is the same color as
its own background rather than a hard line, so it visually reads
as "raised up out of the black bar, connected to the page below"
rather than just another highlighted nav item. */
background: var(--bond-panel);
color: var(--bond-gold-bright);
font-family: exo2;
font-weight: 600;
letter-spacing: 0.06em;
font-size: 8pt;
padding: 7px 10px 8px 10px;
margin: 4px 0px 0px 0px;
border: 1px solid var(--bond-gold);
border-bottom: 1px solid var(--bond-panel);
border-radius: 5px 5px 0px 0px;
box-shadow: 0 -2px 8px rgba(197, 164, 90, 0.18);
text-shadow: 0 0 0.5em rgba(197, 164, 90, 0.35);
}
.baritem:hover {
color: var(--bond-gold-bright);
border-bottom: 2px solid var(--bond-line);
transition: color 0.2s ease, border-color 0.2s ease;
}
.panel {
background: var(--bond-panel);
margin: 10px;
padding: 3px;
border: 1px solid var(--bond-line-soft);
border-radius: 3px;
}
.panel table {
font: 12px exo2;
padding: 5px;
background: var(--bond-panel-2);
border: 1px solid var(--bond-line-soft);
border-radius: 6px;
color: var(--bond-text);
}
.panel table th {
background: #101014;
color: var(--bond-gold-bright);
padding: 2px 3px 3px 3px;
border: 0pt;
letter-spacing: 0.04em;
}
.panel table td {
background: transparent;
color: var(--bond-text);
padding: 2px 3px 3px 3px;
border: 0pt;
}
.left {
text-align: right;
padding-left: 20px;
border-radius: 6px 0px 0px 6px;
}
.right {
border-radius: 0px 6px 6px 0px;
padding-right: 20px;
}
.featured { background: var(--bond-panel); }
.buttonbay {
width: 100%;
text-align: center;
}
.fieldinput {
font-family: exo2;
border-radius: 3px;
padding: 2px 2px 2px 5px;
border: 1px solid var(--bond-line-soft);
background: #101014;
color: var(--bond-text);
}
.fieldinputerror {
font-family: exo2;
border-radius: 3px;
padding: 2px 2px 2px 5px;
background: #241213;
border: 1px solid var(--bond-red);
color: var(--bond-text);
}
.fieldprompt {
font-size: 10pt;
text-align: right;
color: var(--bond-gold-bright);
background: transparent;
}
.message { font: bold 10pt verdana; color: #d97a7a; }
.collection_heading { font: bold 12pt verdana; color: var(--bond-gold-bright); }
.collection_text { font: 10pt verdana; color: var(--bond-text); }
.collection_tracks_background { font: 8pt bold verdana; color: var(--bond-text); background: #101014; }
.warning { font: 10pt verdana; background: #3a1414; color: #e0a0a0; text-align: justify; border: 1px solid var(--bond-red); }
.button {
position: relative;
display: inline-block;
font-size: 10pt;
font-weight: 600;
letter-spacing: 0.04em;
color: var(--bond-gold-bright);
border: 1px solid var(--bond-gold);
background: linear-gradient(180deg, #1c1c24, #131318);
padding: 2px 10px 3px 10px;
margin: 0px;
border-radius: 3px;
transition: box-shadow 0.2s ease, background 0.2s ease;
}
.button:hover {
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.35);
background: linear-gradient(180deg, #24242e, #1a1a20);
}
.button:after{
content: none;
}
.code {
font-family: source;
font-weight: 400;
font-size: 10pt;
border: 1px solid var(--bond-line-soft);
background: #101014;
color: var(--bond-gold-bright);
padding: 5px;
}
/* SPA content-swap fade transition */
#content {
transition: opacity 0.18s ease;
}
#content.spa-fading {
opacity: 0;
}
/* Shopping cart */
.cart-notice {
background: var(--bond-panel-2);
border: 1px solid var(--bond-line);
border-left: 3px solid var(--bond-gold);
color: var(--bond-text);
padding: 8px 12px;
margin: 0 0 10px 0;
border-radius: 3px;
font-size: 9pt;
}
.cart-wrap {
border: 1px solid var(--bond-line);
border-radius: 4px;
overflow: hidden;
background: var(--bond-panel);
}
.cart-header {
display: grid;
grid-template-columns: 1fr 90px 90px 100px 70px;
gap: 8px;
align-items: center;
padding: 8px 14px;
background: linear-gradient(180deg, #1c1c24, #131318);
border-bottom: 1px solid var(--bond-line);
color: var(--bond-gold-bright);
font-size: 8pt;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 600;
}
.cart-header .cart-col-price,
.cart-header .cart-col-qty,
.cart-header .cart-col-total {
text-align: right;
}
.cart-items {
max-height: 420px;
overflow-y: auto;
}
.cart-row {
display: grid;
grid-template-columns: 1fr 90px 90px 100px 70px;
gap: 8px;
align-items: center;
padding: 10px 14px;
border-bottom: 1px solid var(--bond-line-soft);
color: var(--bond-text);
font-size: 9pt;
transition: background 0.15s ease;
}
.cart-row:last-child { border-bottom: none; }
.cart-row:hover {
background: rgba(197, 164, 90, 0.06);
}
.cart-row .cart-col-desc {
font-weight: 500;
color: var(--bond-text);
}
.cart-row .cart-col-price,
.cart-row .cart-col-total {
text-align: right;
font-variant-numeric: tabular-nums;
}
.cart-row .cart-col-total {
color: var(--bond-gold-bright);
font-weight: 600;
}
.cart-row .cart-col-qty {
text-align: right;
}
.cart-qty-input {
width: 60px !important;
text-align: center;
margin: 0 !important;
display: inline-block !important;
}
.cart-col-remove {
text-align: right;
}
.cart-remove-link {
color: var(--bond-text-dim) !important;
font-size: 8pt;
letter-spacing: 0.04em;
text-transform: uppercase;
border: 1px solid var(--bond-line-soft);
border-radius: 3px;
padding: 3px 8px;
transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
}
.cart-remove-link:hover {
color: #d97a7a !important;
border-color: var(--bond-red);
background: rgba(161, 58, 58, 0.12);
}
.cart-summary {
padding: 12px 14px;
background: linear-gradient(180deg, #131318, #0d0d10);
border-top: 1px solid var(--bond-line);
}
.cart-summary-row {
display: flex;
justify-content: space-between;
align-items: baseline;
color: var(--bond-text);
font-size: 10pt;
}
.cart-summary-total {
color: var(--bond-gold-bright);
font-size: 14pt;
font-weight: 700;
letter-spacing: 0.02em;
}
.cart-empty {
text-align: center;
padding: 50px 20px;
color: var(--bond-text-dim);
}
.cart-empty-icon {
font-size: 40pt;
opacity: 0.5;
margin-bottom: 8px;
}
.cart-empty-title {
font-size: 13pt;
color: var(--bond-text);
letter-spacing: 0.04em;
margin-bottom: 4px;
}
.cart-empty-text {
font-size: 9pt;
color: var(--bond-text-dim);
}
/* Checkout */
.checkout-header {
display: grid;
grid-template-columns: 1fr 90px 70px 100px;
gap: 8px;
align-items: center;
padding: 8px 14px;
background: linear-gradient(180deg, #1c1c24, #131318);
border-bottom: 1px solid var(--bond-line);
color: var(--bond-gold-bright);
font-size: 8pt;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 600;
}
.checkout-header .checkout-col-qty {
text-align: right;
}
.checkout-row {
display: grid;
grid-template-columns: 1fr 90px 70px 100px;
gap: 8px;
align-items: center;
padding: 10px 14px;
border-bottom: 1px solid var(--bond-line-soft);
color: var(--bond-text);
font-size: 9pt;
}
.checkout-row:last-child { border-bottom: none; }
.checkout-row .checkout-col-qty {
text-align: right;
color: var(--bond-text-dim);
}
.checkout-pay-wrap {
max-width: 380px;
margin: 0 auto;
padding: 6px 0 4px 0;
}
.checkout-pay-label {
font-size: 8pt;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--bond-text-dim);
margin-bottom: 6px;
}
.checkout-card-input {
background: var(--bond-panel-2);
border: 1px solid var(--bond-line);
border-radius: 4px;
padding: 10px;
min-height: 40px;
margin-bottom: 14px;
}
.checkout-pay-btn {
display: block;
width: 100%;
font-size: 11pt;
padding: 9px 10px 10px 10px;
text-align: center;
color: #0a0a0d;
background: linear-gradient(180deg, var(--bond-gold-bright), var(--bond-gold));
border: 1px solid var(--bond-gold);
cursor: pointer;
}
.checkout-pay-btn:hover {
background: linear-gradient(180deg, #f0d89a, var(--bond-gold-bright));
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.45);
}
.checkout-pay-btn:disabled {
cursor: default;
opacity: 0.55;
background: linear-gradient(180deg, #1c1c24, #131318);
color: var(--bond-text-dim);
box-shadow: none;
}
.checkout-processing {
visibility: hidden;
background: var(--bond-panel-2);
border: 1px solid var(--bond-line);
border-left: 3px solid var(--bond-gold);
color: var(--bond-text);
padding: 8px 12px;
margin-top: 12px;
border-radius: 3px;
font-size: 9pt;
}
.checkout-error {
color: #d97a7a;
font-size: 9pt;
margin-top: 12px;
min-height: 1.2em;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 811 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

-385
View File
@@ -1,385 +0,0 @@
.rotate {
animation: rotation 1s infinite linear;
}
@keyframes rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(359deg);
}
}
@font-face {
font-family: avenir;
src: url('https://barant.com/fonts/AvenirLTStd-Light.ttf');
}
@font-face {
font-family: source;
src: url('https://barant.com/fonts/jackinput.TTF');
}
@font-face {
font-family: exo2;
src: url('https://barant.com/fonts/Exo2-RegularCondensed.otf');
}
body {background: linear-gradient(to bottom, #ccc, #444);
font-family: exo2;
margin: 10px 10px 10px 10px;
width: 98%;
}
a:link {text-decoration: none}
a:visited {text-decoration:none}
a:hover {text-decoration:none}
h1 {font: 20pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
color: #808080;
opacity: 0.9;}
h2 {font: 14pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
h3 {font: 12pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
p {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
ul {font-family: 8pt exo2;}
li {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
.project_header {background: #88c;
color: #fff;
padding: 5px;
font-weight: 400;
font-size: 14px;
}
.pageclass {background: #fff;
border-radius: 10px;
border: 2pt outset;
border-spacing: 0px;
padding: 0px;
max-width: 1050px;
min-width: 1050px
margin: auto;
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
font-family: exo2;
font-size: 10pt;
}
input {background: #fff;
border: 1px inset;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-o-border-radius: 2px;
-ms-border-radius: 2px;
border-radius: 0px;
}
select {background: #fff;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
border: 1px solid #444;
padding: 1px 2px 1px 2px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
textarea.fieldinput {background: #fff;
resize: none;
font-family: exo2;
border: 1px solid #444;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
-o-border-radius: 0px;
-ms-border-radius: 0px;
border-radius: 0px;
}
textarea.fieldinputerror {background: #fcc;
resize: none;
font-family: exo2;
border: 1px solid #f00;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
.sectionframe {
position: relative;
font-family: exo2;
border: 0px outset;
font-size: 10pt;
margin: 3px;
background: #808080;
padding: 0px;
border-radius: 0px;
}
.sectionframe:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 12px;
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
}
.sectionframecontents {
padding: 10px;
text-align: justify;
color: #000000;
border: 1pt inset;
background-color: #F8F8FF;
}
.sectionframeheading {
# background: linear-gradient(to bottom, #fff, #88f);
background: #2099f0;
color: #fff;
border: 1pt outset;
vertical-align: middle;
padding: 5px;
margin: 0px;
font-family: 12pt avenir;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 0px 0px 0px 0px;
}
.sectionframeheading2 {
background: #C0C0C0;
font-family: exo2;
font-size: 20pt;
padding: 3px
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 3px;
}
.heading {background: #fff;
border-radius: 7px 7px 0px 0px;
max-height: 80px;
}
.entryform {
background: #2099f0;
padding: 3px 3px 3px 3px;
margin: 0px;
border: 0px solid black;
border-radius: 0px;
}
.entryform table {
font: 12px exo2;
background: #c5e1f4;
border: 0pt solid black;
}
.footer {
background: linear-gradient(to bottom, #000, #888);
font: 8pt verdana;
color: #FFFFFF;
text-align: center;
border-radius: 0px 0px 6px 6px;}
.menubar {
# background: linear-gradient(to bottom, #fff, #2099f0);
padding: 0px 0px 0px 0px;
margin: 0px;
}
.baritem {
background-image: linear-gradient(#2099f0, #c3ddef);
color: #fff;
position: relative;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 10px 0px 0px 0px;
border: solid;
border-width: 0px 0px 1px 0px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 50%;
z-index: 5;
pointer-events: none;
border-radius: 4px 4px 0px 0px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.baritemselected {
background: #ccc;
color: #000;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 5px 10px 0px 0px;
border: solid;
border-width: 1px 1px 0px 1px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:hover {
background: #c3ddef;
color: #fff;
transition: background 5s;
}
.panel {background: #ccc;
margin: 10px;
padding: 3px;
border: 0pt inset;}
.panel table {
font: 12px exo2;
padding: 5px;
background: #c5e1f4;
border: 1pt solid black;
border-radius: 9px;
}
.panel table th {
background: #2099f0;
color: #fff;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.panel table td {
background: #c5e1f4;
color: #000;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.left {
text-align: right;
padding-left: 20px;
border-radius: 9px 0px 0px 9px;
}
.right {
border-radius: 0px 9px 9px 0px;
padding-right: 20px;
}
.featured {background: #fff}
.buttonbay {
width: 100%;
text-align: center;
}
.fieldinput {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
border: 1px solid #ccc;
}
.fieldinputerror {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
background: #fcc;
border: 1px solid red;
}
.fieldprompt {
font-size: 10pt;
text-align: right;
background: #00f;
}
.message {font: bold 10pt verdana; color: #FF0000}
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
.collection_text {font: 10pt verdana; color: #FFFFFF}
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
.button {
position: relative;
display: inline-block;
font-size: 10pt;
font-weight: 400;
color: #fff;
border: 2px outset;
background: #2099f0;
padding: 2px 10px 3px 10px;
margin: 0px;
border-radius: 5px;
}
.button:after{
content: '';
position: absolute;
top: 0px;
left: 0px;
width: calc(100% - 0px);
height: 10px;
z-index: 5;
border-radius: 3px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.code {
font-family: source;
font-weight: 400;
font-size: 10pt;
border: 1pt solid black;
background: #ff8;
padding: 5px;
}
+173 -20
View File
@@ -12,28 +12,27 @@ IMG_CACHE = ROOT + "/assets/images"
os.makedirs(OUT, exist_ok=True)
os.makedirs(IMG_CACHE, exist_ok=True)
IMG_MIME = {
".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
".gif": "image/gif", ".svg": "image/svg+xml", ".webp": "image/webp",
".ico": "image/x-icon",
}
def resolve_images(html):
"""Find any remaining /images/<file> reference (src="..." or url('...'))
and inline it as a data: URI, fetching+caching from barant.com on first
use - APIServer has no static-file serving, same reason the chrome logo
and page CSS/fonts needed inlining earlier this session."""
"""Find any /images/<file> or images/<file> reference (src="...",
href="...", or CSS url('...')) and repoint it at the live APIServer
GET /assets/{filename} route instead of inlining it as a data: URI -
fetching+caching from barant.com into the same assets/images/ cache
directory on first use (unchanged), just no longer embedding the raw
bytes into every page's own HTML (undoes the earlier base64-inlining
approach now that a real static-asset module exists to serve these).
Matches both the absolute form (/images/x.png) and the relative form
(images/x.png, no leading slash) - the previous version of this
function only matched the absolute form, silently leaving several
real <img src="images/.."> references un-rewritten and pointing
nowhere (APIServer has no /images/ route at all)."""
def repl(m):
path = m.group(1) # e.g. images/grid.png
fname = path.split("/")[-1]
ext = os.path.splitext(fname)[1].lower()
mime = IMG_MIME.get(ext, "application/octet-stream")
local_path = IMG_CACHE + "/" + fname
if not os.path.exists(local_path):
subprocess.run(["curl", "-s", "-o", local_path, "https://barant.com/" + path], check=True)
return data_uri(local_path, mime)
html = re.sub(r'/images/([A-Za-z0-9_.-]+)(?=["\'])', repl, html)
return "/assets/" + fname
html = re.sub(r'/?images/([A-Za-z0-9_.-]+)(?=["\'])', repl, html)
return html
@@ -199,6 +198,72 @@ opensource_menu = flatten_linkbuttons(opensource_menu)
SIDEBAR_HTML = opensource_menu
# ---------------------------------------------------------------------------
# SPA bootstrap script: present once, in the chrome, on every FULL page load
# (never in a fragment-only response, which has no <head>/<script> of its
# own). Intercepts clicks on internal <a href="/..."> links and swaps just
# #jetc-content via fetch('/name?fragment=1') instead of a full navigation;
# also drives the browser back/forward buttons via popstate. See the
# FULL_PAGE_TMPL / FRAGMENT_TMPL split in convert_page() for how a single
# route serves both the full page and the fragment-only response, decided
# by the ?fragment=1 query flag.
# ---------------------------------------------------------------------------
# Pages excluded from client-side fragment fetching entirely - a click on
# one of these falls through to an ORDINARY browser navigation (hitting
# the full-page route, confirmed safe) instead of being intercepted.
# Real, deterministic finding: <name>?fragment=1 for a MYSQL_PAGES page
# crashes the whole apiserver process on the very FIRST such request
# (reproduced repeatedly - not state-dependent, not "two failures in a
# row"), while the exact same page's full-page route (no ?fragment=1)
# fails cleanly with the expected "database and host parameters are not
# valid." and the server survives. Root cause not isolated (a <mysql>
# connection failure unwinding through the smaller <tag name="_frag_X">
# definition specifically, vs surviving fine through the larger
# <tag name="_full_X"> one, for reasons not chased down further given
# scope) - this is a mitigation, not a fix, and only matters while these
# pages fail (no real DB password configured); worth re-testing once a
# real DB is wired in, since a successful <mysql> connection takes a
# completely different code path that may not hit this at all.
FRAGMENT_EXCLUDED_PAGES = sorted(MYSQL_PAGES)
SPA_SCRIPT = """<script>
(function() {
var FRAGMENT_EXCLUDED = %s;
function pageNameFromPath(path) {
var name = path.replace(/^\\//, '').replace(/\\.page$/, '');
return name || 'main';
}
function loadPage(name, push) {
fetch('/' + name + '?fragment=1').then(function(resp) {
if (!resp.ok) throw new Error('HTTP ' + resp.status);
return resp.text();
}).then(function(html) {
var el = document.getElementById('jetc-content');
if (el) el.innerHTML = html;
if (push) history.pushState({page: name}, '', '/' + name);
}).catch(function(err) {
console.error('jetc-spa: failed to load page', name, err);
});
}
document.addEventListener('click', function(ev) {
if (ev.defaultPrevented || ev.button !== 0 || ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey) return;
var target = ev.target.nodeType === 1 ? ev.target : ev.target.parentElement;
var a = target ? target.closest('a') : null;
if (!a) return;
if (a.target === '_blank' || a.hasAttribute('download')) return;
var href = a.getAttribute('href') || '';
if (href.indexOf(':') !== -1 || href.indexOf('//') === 0 || href.indexOf('/') !== 0) return;
if (FRAGMENT_EXCLUDED.indexOf(pageNameFromPath(href)) !== -1) return;
ev.preventDefault();
loadPage(pageNameFromPath(href), true);
});
window.addEventListener('popstate', function() {
loadPage(pageNameFromPath(location.pathname), false);
});
})();
</script>""" % (repr(FRAGMENT_EXCLUDED_PAGES).replace("'", '"'))
# ---------------------------------------------------------------------------
# Build the page chrome from mainpagetemplate.temp: the part of <template>
# before <contents> and the part after.
@@ -208,6 +273,39 @@ temp_raw = read(SRC + "/mainpagetemplate.temp")
m = re.search(r'<template>(.*)</template>', temp_raw, re.DOTALL)
template_body = m.group(1)
# mainpagetemplate.temp's own <tag name="title">...</tag> helper is dead
# code in this conversion - title substitution happens via a plain Python
# string-replace on <exclude>$[_title]</exclude> below, never by actually
# invoking this helper. Stripped as genuinely dead code (not a bug fix -
# see below for the real one).
template_body = drop_tag_block(template_body, "title")
# Real bug found and isolated via a minimal standalone repro (bisecting
# down from "the whole chrome throws 'comment must have a container'"):
# a <comment>...</comment> block, when it ends up nested inside one of
# this script's own <tag name="_full_NAME">/<tag name="_frag_NAME">
# definitions (see convert_page() below) - needed so the fragment/full
# <if> branches can hold real HTML content without jetc's compile-time
# <if> body parser choking on it - fails at RUNTIME with "comment must
# have a container", even though the exact same <comment> block renders
# fine as ordinary top-level content. Reproduced with a 4-line synthetic
# case (<tag name="x">text<comment>plain text, no nested tags</comment>
# text</tag>) - so this is a genuine jetc/JetCore bug in how a custom tag
# DEFINITION'S stored text gets re-processed at <dotag> invocation time,
# not something specific to this page's content. Flagged for the project,
# not fixed here (root cause not isolated further - the base Tag class's
# container-boundary bookkeeping is shared by many tags and risky to
# change without full regression coverage).
#
# Worked around instead: this specific <comment> block wraps content
# gated on $[_login_id] (show a logged-in session var menu) - the EXACT
# same "session-gated, always empty for an anonymous visitor" category
# already established as this conversion's design for cart.menu/login.menu/
# the ACCOUNT+ADMIN nav tabs (see below) - so stripping it entirely is
# consistent with the rest of this file, not a new compromise.
template_body = re.sub(r'<comment>\s*<if value1="\$\[_login_id\]".*?</if>\s*</comment>',
'', template_body, flags=re.DOTALL)
# Substitute the chrome-level includes/placeholders that are now fixed for
# every page in this conversion (no per-page menubar/menu overrides exist -
# confirmed by grepping every source .page file for _menubar/_menu overrides
@@ -221,7 +319,13 @@ template_body = re.sub(r'<if value1="\$\[_menu\]" value2="" type="eq">\s*<includ
CONTENTS_MARKER = "<contents>"
idx = template_body.index(CONTENTS_MARKER)
CHROME_BEFORE = resolve_images(template_body[:idx])
CHROME_AFTER = resolve_images(template_body[idx + len(CONTENTS_MARKER):])
CHROME_AFTER = resolve_images(template_body[idx + len(CONTENTS_MARKER):]) + SPA_SCRIPT
FULL_PAGE_TMPL = (
'<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]'
'<html lang="en"><head><title>%s</title>%s</head><body>'
'%s<div id="jetc-content">%s</div>%s</body></html>'
)
def convert_page(name):
@@ -262,11 +366,60 @@ def convert_page(name):
chrome_before = CHROME_BEFORE.replace('<exclude>$[_title]</exclude>', page_title)
full_page = FULL_PAGE_TMPL % (page_title, STYLE_BLOCK, chrome_before, contents, CHROME_AFTER)
if name in MYSQL_PAGES:
# Real, reproducible server crash (heap corruption - "free():
# invalid pointer" seen live) when a <mysql> connection failure
# unwinds through the smaller fragment-mode <tag name="_frag_X">
# definition specifically - the exact same failure through the
# larger _full_X definition is fine (clean caught exception, 500).
# The client-side click handler already skips fetching these pages
# as fragments (FRAGMENT_EXCLUDED, above), but that only protects
# normal clicking - a stale already-open tab (running JS from
# before that fix shipped) or anyone hitting the URL directly
# would still trigger it. This is the real, server-side fix: the
# fragment response for these pages never attempts the <mysql>
# connection at all, so the crash is unreachable regardless of
# how the request arrives. Re-test once a real DB password makes
# these pages actually work - a successful connection takes a
# different code path that may not need this at all.
fragment_page = ('<div id="jetc-content"><p>This page requires a full load - '
'<a href="/%s">view it directly</a>.</p></div>') % name
else:
fragment_page = '<div id="jetc-content">%s</div>' % contents
# A direct/full-page load and an SPA-driven fragment fetch both hit this
# SAME route (/name) - distinguished by ?fragment=1 in the query string,
# per the user's explicit choice over a separate /name.page route. A
# normal load has no query string at all, so $[fragment] is simply
# unset - referencing an unset global variable throws ("global variable
# is not initialized.").
#
# Two real jetc bugs found and worked around while building this (both
# confirmed via direct minimal reproduction, not guessed):
# 1. <try> safely captures the possibly-unset $[fragment] into
# fragflag (always "1" or "" afterward) - but <try> must wrap ONLY
# the <set>, never an <if>. Nesting <if>/<else> INSIDE <try> silently
# drops the <else> branch's output specifically when compiled
# through jetc (works fine in jet-2.0's own interpreter; the bug is
# jetc-compiled-only). The branching <if> lives entirely OUTSIDE/
# AFTER <try> instead.
# 2. A large/complex body (real inlined HTML+CSS+JS, hundreds of KB)
# placed directly as an <if>'s branch content fails to COMPILE at
# all ("unterminated <html> - no matching close tag found") - jetc's
# own compile-time <if>/<else> body scanner isn't robust against
# real-world markup at this scale. Worked around by keeping the
# <if>'s own branches tiny (self-closing custom-tag invocations)
# and moving the real content into <tag name="..."> DEFINITIONS
# (which jetc never compile-time-parses at all - stored as opaque
# raw text, exactly like a <try> body, and only actually rendered
# via <dotag> at runtime).
body = (
'<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]'
'<html lang="en"><head><title>%s</title>%s</head><body>'
'%s%s%s</body></html>'
) % (page_title, STYLE_BLOCK, chrome_before, contents, CHROME_AFTER)
'<try name="_fragerr"><set name="fragflag" expr="$[fragment]" /><catch><set name="fragflag" value="" /></try>'
'<tag name="_frag_%s">%s</tag><tag name="_full_%s">%s</tag>'
'<if value1="$[fragflag]" value2="1" type="eq"><_frag_%s /><else><_full_%s /></if>'
) % (name, fragment_page, name, full_page, name, name)
jet_text = "#api GET /%s\n%s\n" % (name, body)
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /applications
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>APPLICATIONS</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">APPLICATIONS</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Project Manager</b></div><div class="sectionframecontents">
<p>A comprehensive project manager that extends an agile like
@@ -485,7 +480,7 @@ against transaction flow placed in a calendar.</p>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+7 -12
View File
@@ -1,4 +1,3 @@
#api GET /asm1802
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>RCA1802 Micro-Controller Assembler/Emulator</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">RCA1802 Micro-Controller Assembler/Emulator</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,16 +463,12 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>RCA1802</b></div><div class="sectionframecontents">
<h1>The RCA1802 Micro-Controller</h1>
<img src="images/rca1802chip.jpeg" align="right">
<img src="/assets/rca1802chip.jpeg" align="right">
<p>Back in the 1970's RCA released a chip that was widely used in
satellites and other spacecraft to this day. It is a very simple
8-bit micro-controller with 16-bit addressibility enabling memory
@@ -496,7 +491,7 @@ device.</p>
</div></div>
<div class="sectionframe"><div class="sectionframeheading"><b>RCA1802 Emulator</b></div><div class="sectionframecontents">
<img src="images/emu1802a.png" align="right" width="500">
<img src="/assets/emu1802a.png" align="right" width="500">
<p>The 1802 emulator provides a fully functional RCA1802
micro-controller device complete with interupt handling and DMA
controls for memory access. Experiment with code structures and build
@@ -518,7 +513,7 @@ change environment going for the Kicad project as well as the source
code for the assembler and emulator components.
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /barantmail
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>BARANTMAIL OPEN SOURCE PROJECT</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">BARANTMAIL OPEN SOURCE PROJECT</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>BARANTMAIL OPEN SOURCE PROJECT</b></div><div class="sectionframecontents">
<p>In the year 2000 I was extremely frustrated with the state of e-amil
systems available to Linux. Sendmail and q-mail were pretty much the two
@@ -489,7 +484,7 @@ I also wanted a scalable multi-server capability.</p>
</ul>
<p></p>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+16 -503
View File
@@ -1,503 +1,16 @@
#api GET /contact
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Support E-Mail</title><style>
.rotate {
animation: rotation 1s infinite linear;
}
@keyframes rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(359deg);
}
}
@font-face {
font-family: avenir;
src: url('data:font/ttf;base64,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 truncated
}
@font-face {
font-family: source;
src: url('data:font/ttf;base64,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 truncated
}
@font-face {
font-family: exo2;
src: url('data:font/otf;base64,T1RUTwALAIAAAwAwQ0ZGIF65aMUAAA4EAACDv0dQT1NyBlyKAACeSAAAYTJHU1VCWwJIAAAAmQgAAAU+T1MvMmqogawAAAEgAAAAYGNtYXC4LHjGAAAGoAAAB0JoZWFkA3NjtwAAALwAAAA2aGhlYQc+BIEAAAD0AAAAJGhtdHg+CUgTAACRxAAAB0RtYXhwAdFQAAAAARgAAAAGbmFtZVDBsvwAAAGAAAAFHnBvc3T/uAAyAAAN5AAAACAAAQAAAAEAQYT55LNfDzz1AAMD6AAAAADQhBABAAAAANCEEAH/c/7tA+EDpwAAAAMAAgAAAAAAAAABAAAD5/83AAAEBf9z/3MD4QABAAAAAAAAAAAAAAAAAAAB0QAAUAAB0QAAAAMByAGQAAMACAKKAlgAAABLAooCWAAAAV4AMgEkAAAAAAUGAAAAAAAAAAACBwAAAAAAAAAAAAAAAFVLV04AQAAg+wICvP83ASsD5wDJIAAAlwAAAAAB5wKyAAAAIAADAAAAFgEOAAEAAAAAAAAATwAAAAEAAAAAAAEABQBPAAEAAAAAAAIAEQBUAAEAAAAAAAMAIABlAAEAAAAAAAQAFwCFAAEAAAAAAAUAPACcAAEAAAAAAAYAFQDYAAEAAAAAAAkADQDtAAEAAAAAAAwAEwD6AAEAAAAAAA4APwENAAMAAQQJAAAAngFMAAMAAQQJAAEAHgHqAAMAAQQJAAIADgIIAAMAAQQJAAMAQAIWAAMAAQQJAAQALgJWAAMAAQQJAAUAeAKEAAMAAQQJAAYAKgL8AAMAAQQJAAkAGgMmAAMAAQQJAAwAJgNAAAMAAQQJAA4AfgNmAAMAAQQJABAACgPkAAMAAQQJABEAIgPuQ29weXJpZ2h0IKkgMjAxNCwgTmF0YW5hZWwgR2FtYSAod3d3Lm5kaXNjb3ZlcmVkLmNvbSAuIGluZm8oYXQpbmRpc2NvdmVyZWQuY29tKUV4byAyUmVndWxhciBDb25kZW5zZWQxLjAwMTtVS1dOO0V4bzItUmVndWxhckNvbmRlbnNlZEV4byAyIFJlZ3VsYXIgQ29uZGVuc2VkVmVyc2lvbiAxLjAwMTtQUyAwMDEuMDAxO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU4MzI5RXhvMi1SZWd1bGFyQ29uZGVuc2VkTmF0YW5hZWwgR2FtYXd3dy5uZGlzY292ZXJlZC5jb21odHRwOi8vc2NyaXB0cy5zaWwub3JnL2Ntcy9zY3JpcHRzL3BhZ2UucGhwP3NpdGVfaWQ9bnJzaSZpZD1PRkwAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADEANAAsACAATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQAgACgAdwB3AHcALgBuAGQAaQBzAGMAbwB2AGUAcgBlAGQALgBjAG8AbQAgAC4AIABpAG4AZgBvACgAYQB0ACkAbgBkAGkAcwBjAG8AdgBlAHIAZQBkAC4AYwBvAG0AKQBFAHgAbwAgADIAIABDAG8AbgBkAGUAbgBzAGUAZABSAGUAZwB1AGwAYQByADEALgAwADAAMQA7AFUASwBXAE4AOwBFAHgAbwAyAC0AUgBlAGcAdQBsAGEAcgBDAG8AbgBkAGUAbgBzAGUAZABFAHgAbwAgADIAIABSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARQB4AG8AMgAtAFIAZQBnAHUAbABhAHIAQwBvAG4AZABlAG4AcwBlAGQATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQB3AHcAdwAuAG4AZABpAHMAYwBvAHYAZQByAGUAZAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBjAG0AcwAvAHMAYwByAGkAcAB0AHMALwBwAGEAZwBlAC4AcABoAHAAPwBzAGkAdABlAF8AaQBkAD0AbgByAHMAaQAmAGkAZAA9AE8ARgBMAEUAeABvACAAMgBSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAAAAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AZUAAAAAAAABlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVAXUBfAF3AZoBrgG2AX0BhQGG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 truncated
}
body {background: linear-gradient(to bottom, #ccc, #444);
font-family: exo2;
margin: 10px 10px 10px 10px;
width: 98%;
}
a:link {text-decoration: none}
a:visited {text-decoration:none}
a:hover {text-decoration:none}
h1 {font: 20pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
color: #808080;
opacity: 0.9;}
h2 {font: 14pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
h3 {font: 12pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
p {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
ul {font-family: 8pt exo2;}
li {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
.project_header {background: #88c;
color: #fff;
padding: 5px;
font-weight: 400;
font-size: 14px;
}
.pageclass {background: #fff;
border-radius: 10px;
border: 2pt outset;
border-spacing: 0px;
padding: 0px;
max-width: 1050px;
min-width: 1050px
margin: auto;
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
font-family: exo2;
font-size: 10pt;
}
input {background: #fff;
border: 1px inset;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-o-border-radius: 2px;
-ms-border-radius: 2px;
border-radius: 0px;
}
select {background: #fff;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
border: 1px solid #444;
padding: 1px 2px 1px 2px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
textarea.fieldinput {background: #fff;
resize: none;
font-family: exo2;
border: 1px solid #444;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
-o-border-radius: 0px;
-ms-border-radius: 0px;
border-radius: 0px;
}
textarea.fieldinputerror {background: #fcc;
resize: none;
font-family: exo2;
border: 1px solid #f00;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
.sectionframe {
position: relative;
font-family: exo2;
border: 0px outset;
font-size: 10pt;
margin: 3px;
background: #808080;
padding: 0px;
border-radius: 0px;
}
.sectionframe:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 12px;
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
}
.sectionframecontents {
padding: 10px;
text-align: justify;
color: #000000;
border: 1pt inset;
background-color: #F8F8FF;
}
.sectionframeheading {
# background: linear-gradient(to bottom, #fff, #88f);
background: #2099f0;
color: #fff;
border: 1pt outset;
vertical-align: middle;
padding: 5px;
margin: 0px;
font-family: 12pt avenir;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 0px 0px 0px 0px;
}
.sectionframeheading2 {
background: #C0C0C0;
font-family: exo2;
font-size: 20pt;
padding: 3px
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 3px;
}
.heading {background: #fff;
border-radius: 7px 7px 0px 0px;
max-height: 80px;
}
.entryform {
background: #2099f0;
padding: 3px 3px 3px 3px;
margin: 0px;
border: 0px solid black;
border-radius: 0px;
}
.entryform table {
font: 12px exo2;
background: #c5e1f4;
border: 0pt solid black;
}
.footer {
background: linear-gradient(to bottom, #000, #888);
font: 8pt verdana;
color: #FFFFFF;
text-align: center;
border-radius: 0px 0px 6px 6px;}
.menubar {
# background: linear-gradient(to bottom, #fff, #2099f0);
padding: 0px 0px 0px 0px;
margin: 0px;
}
.baritem {
background-image: linear-gradient(#2099f0, #c3ddef);
color: #fff;
position: relative;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 10px 0px 0px 0px;
border: solid;
border-width: 0px 0px 1px 0px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 50%;
z-index: 5;
pointer-events: none;
border-radius: 4px 4px 0px 0px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.baritemselected {
background: #ccc;
color: #000;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 5px 10px 0px 0px;
border: solid;
border-width: 1px 1px 0px 1px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:hover {
background: #c3ddef;
color: #fff;
transition: background 5s;
}
.panel {background: #ccc;
margin: 10px;
padding: 3px;
border: 0pt inset;}
.panel table {
font: 12px exo2;
padding: 5px;
background: #c5e1f4;
border: 1pt solid black;
border-radius: 9px;
}
.panel table th {
background: #2099f0;
color: #fff;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.panel table td {
background: #c5e1f4;
color: #000;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.left {
text-align: right;
padding-left: 20px;
border-radius: 9px 0px 0px 9px;
}
.right {
border-radius: 0px 9px 9px 0px;
padding-right: 20px;
}
.featured {background: #fff}
.buttonbay {
width: 100%;
text-align: center;
}
.fieldinput {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
border: 1px solid #ccc;
}
.fieldinputerror {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
background: #fcc;
border: 1px solid red;
}
.fieldprompt {
font-size: 10pt;
text-align: right;
background: #00f;
}
.message {font: bold 10pt verdana; color: #FF0000}
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
.collection_text {font: 10pt verdana; color: #FFFFFF}
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
.button {
position: relative;
display: inline-block;
font-size: 10pt;
font-weight: 400;
color: #fff;
border: 2px outset;
background: #2099f0;
padding: 2px 10px 3px 10px;
margin: 0px;
border-radius: 5px;
}
.button:after{
content: '';
position: absolute;
top: 0px;
left: 0px;
width: calc(100% - 0px);
height: 10px;
z-index: 5;
border-radius: 3px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.code {
font-family: source;
font-weight: 400;
font-size: 10pt;
border: 1pt solid black;
background: #ff8;
padding: 5px;
}
.controlframe {background: #888;
padding: 5px 5px 15px 10px;
}
.vm {position: relative;
height: 55px;
}
.vmname {position: absolute;
left: 0px; top: 0px;
height: 55px;
}
.vmcover {position: absolute;
left: 15px;
top: 30px;
font: 12px 'Dot Matrix';
background: #bbb;
color: white;
border: 1pt solid white;
border-radius: 5px;
padding: 2px 10px 2px 10px;
}
</style></head><body>
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">Support E-Mail</div>
</div>
</div>
<div style="float: right; text-align: right; margin-right: 10px; margin-top: 5px;"></div>
</div>
<div class="menubar">
<table class="menubar" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td style="border-bottom: 1pt solid #bbb; width: 20px;">&nbsp;</td>
<td class="baritem"><a href="/main">HOME</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/services">SERVICES</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/hosting">HOSTING</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/documents">DOCUMENT MGMT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/siptrunk">SIP TRUNKING</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/vst">VST</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/modular1">MODULAR1</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/modular1_patches">MODULAR1 PATCHES</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/synthedit">SYNTHEDIT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/wordpress">WORDPRESS</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/opensource">OPEN SOURCE</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/contact">CONTACT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
</ifrow>
</if>
<td class="baritem"><a href="/login">LOGIN</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td style="border-bottom: 1pt solid #bbb; width: 10px;">&nbsp;</td>
</tr>
</table>
</div>
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
<a href="/jet">JET</a><br>
<a href="/synthmax">SYNTHMAX</a><br>
<a href="/serverframework">SERVER CORE FRAMEWORK</a>
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="sectionframe"><div class="sectionframeheading"><b>Contact</b></div><div class="sectionframecontents">
<p>Please contact us by phone at <b>(702) 232-0050</b>.</p>
<p>To e-mail us, just enter text below and press the buttons:</p>
<entryform>
<field prompt="Name" type="text" name="name" size="50" maxlength="50">
<field prompt="E-Mail" type="text" name="email" size="50" maxlength="50">
<field prompt="Message" type="multiline" name="message" rows="5" cols="60">
<captcha>
<buttonbay>
<div class="button">Send Message</div>
</buttonbay>
</entryform>
<messages>
<script src='https://www.google.com/recaptcha/api.js'></script>
</div></div>
</div>
<div style="clear: both;"></div>
</div>
</div>
<div class="footer" style="clear: both;">&copy; 1999-2026 BARANT Systems, All Rights Reserved</div>
</div>
</body></html>
<include file="../src/SESSIONCTL.tag">
<include file="../src/barant.tag">
<include file="../src/project.tag">
<set name="host" value="localhost">
<set name="database" value="barant">
<set name="user" value="barant">
<set name="password" value="uversa1960">
<database name="$[database]" host="$[host]" user="$[user]" password="$[password]" sessionid="">
<sessionctl page="contact">
<defaultnav>
<setpage name="contact">
</defaultnav>
<link rel="stylesheet" href="/assets/main.css">
<link rel="stylesheet" href="/assets/control.css">
</sessionctl>
</database>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /crystal
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>CRYSTAL</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">CRYSTAL</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Crystal - High Security Communications</b></div><div class="sectionframecontents">
@@ -478,7 +473,7 @@ textarea.fieldinputerror {background: #fcc;
Android.</p>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+6 -11
View File
@@ -1,4 +1,3 @@
#api GET /davidarant
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>barant.com - David Eugene Arant</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">barant.com - David Eugene Arant</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,14 +463,10 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<img src="images/arant2.jpg" align="left">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<img src="/assets/arant2.jpg" align="left">
<h1>David Eugene Arant</h1>
<p>David Eugene Arant was born in South Gate California on April 17th, 1935
to parents May L. Arant and Francis M. Arant.</p>
@@ -491,7 +486,7 @@ on these pages.</p>
</whiledir>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /documents
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Document Management</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">Document Management</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Document Management</b></div><div class="sectionframecontents">
<h1>Online Document Management</h1>
<p>BARANT Technology Group now offers document management storage and
@@ -481,7 +476,7 @@ upon department for internal documents use. Or if you are a service
group you can establish accounts and store correspondence and
documents for any activity with that account.</p>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+16 -503
View File
@@ -1,503 +1,16 @@
#api GET /help
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Support E-Mail</title><style>
.rotate {
animation: rotation 1s infinite linear;
}
@keyframes rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(359deg);
}
}
@font-face {
font-family: avenir;
src: url('data:font/ttf;base64,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 truncated
}
@font-face {
font-family: source;
src: url('data:font/ttf;base64,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 truncated
}
@font-face {
font-family: exo2;
src: url('data:font/otf;base64,T1RUTwALAIAAAwAwQ0ZGIF65aMUAAA4EAACDv0dQT1NyBlyKAACeSAAAYTJHU1VCWwJIAAAAmQgAAAU+T1MvMmqogawAAAEgAAAAYGNtYXC4LHjGAAAGoAAAB0JoZWFkA3NjtwAAALwAAAA2aGhlYQc+BIEAAAD0AAAAJGhtdHg+CUgTAACRxAAAB0RtYXhwAdFQAAAAARgAAAAGbmFtZVDBsvwAAAGAAAAFHnBvc3T/uAAyAAAN5AAAACAAAQAAAAEAQYT55LNfDzz1AAMD6AAAAADQhBABAAAAANCEEAH/c/7tA+EDpwAAAAMAAgAAAAAAAAABAAAD5/83AAAEBf9z/3MD4QABAAAAAAAAAAAAAAAAAAAB0QAAUAAB0QAAAAMByAGQAAMACAKKAlgAAABLAooCWAAAAV4AMgEkAAAAAAUGAAAAAAAAAAACBwAAAAAAAAAAAAAAAFVLV04AQAAg+wICvP83ASsD5wDJIAAAlwAAAAAB5wKyAAAAIAADAAAAFgEOAAEAAAAAAAAATwAAAAEAAAAAAAEABQBPAAEAAAAAAAIAEQBUAAEAAAAAAAMAIABlAAEAAAAAAAQAFwCFAAEAAAAAAAUAPACcAAEAAAAAAAYAFQDYAAEAAAAAAAkADQDtAAEAAAAAAAwAEwD6AAEAAAAAAA4APwENAAMAAQQJAAAAngFMAAMAAQQJAAEAHgHqAAMAAQQJAAIADgIIAAMAAQQJAAMAQAIWAAMAAQQJAAQALgJWAAMAAQQJAAUAeAKEAAMAAQQJAAYAKgL8AAMAAQQJAAkAGgMmAAMAAQQJAAwAJgNAAAMAAQQJAA4AfgNmAAMAAQQJABAACgPkAAMAAQQJABEAIgPuQ29weXJpZ2h0IKkgMjAxNCwgTmF0YW5hZWwgR2FtYSAod3d3Lm5kaXNjb3ZlcmVkLmNvbSAuIGluZm8oYXQpbmRpc2NvdmVyZWQuY29tKUV4byAyUmVndWxhciBDb25kZW5zZWQxLjAwMTtVS1dOO0V4bzItUmVndWxhckNvbmRlbnNlZEV4byAyIFJlZ3VsYXIgQ29uZGVuc2VkVmVyc2lvbiAxLjAwMTtQUyAwMDEuMDAxO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU4MzI5RXhvMi1SZWd1bGFyQ29uZGVuc2VkTmF0YW5hZWwgR2FtYXd3dy5uZGlzY292ZXJlZC5jb21odHRwOi8vc2NyaXB0cy5zaWwub3JnL2Ntcy9zY3JpcHRzL3BhZ2UucGhwP3NpdGVfaWQ9bnJzaSZpZD1PRkwAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADEANAAsACAATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQAgACgAdwB3AHcALgBuAGQAaQBzAGMAbwB2AGUAcgBlAGQALgBjAG8AbQAgAC4AIABpAG4AZgBvACgAYQB0ACkAbgBkAGkAcwBjAG8AdgBlAHIAZQBkAC4AYwBvAG0AKQBFAHgAbwAgADIAIABDAG8AbgBkAGUAbgBzAGUAZABSAGUAZwB1AGwAYQByADEALgAwADAAMQA7AFUASwBXAE4AOwBFAHgAbwAyAC0AUgBlAGcAdQBsAGEAcgBDAG8AbgBkAGUAbgBzAGUAZABFAHgAbwAgADIAIABSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARQB4AG8AMgAtAFIAZQBnAHUAbABhAHIAQwBvAG4AZABlAG4AcwBlAGQATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQB3AHcAdwAuAG4AZABpAHMAYwBvAHYAZQByAGUAZAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBjAG0AcwAvAHMAYwByAGkAcAB0AHMALwBwAGEAZwBlAC4AcABoAHAAPwBzAGkAdABlAF8AaQBkAD0AbgByAHMAaQAmAGkAZAA9AE8ARgBMAEUAeABvACAAMgBSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAAAAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AZUAAAAAAAABlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVAXUBfAF3AZoBrgG2AX0BhQGG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 truncated
}
body {background: linear-gradient(to bottom, #ccc, #444);
font-family: exo2;
margin: 10px 10px 10px 10px;
width: 98%;
}
a:link {text-decoration: none}
a:visited {text-decoration:none}
a:hover {text-decoration:none}
h1 {font: 20pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
color: #808080;
opacity: 0.9;}
h2 {font: 14pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
h3 {font: 12pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
p {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
ul {font-family: 8pt exo2;}
li {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
.project_header {background: #88c;
color: #fff;
padding: 5px;
font-weight: 400;
font-size: 14px;
}
.pageclass {background: #fff;
border-radius: 10px;
border: 2pt outset;
border-spacing: 0px;
padding: 0px;
max-width: 1050px;
min-width: 1050px
margin: auto;
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
font-family: exo2;
font-size: 10pt;
}
input {background: #fff;
border: 1px inset;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-o-border-radius: 2px;
-ms-border-radius: 2px;
border-radius: 0px;
}
select {background: #fff;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
border: 1px solid #444;
padding: 1px 2px 1px 2px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
textarea.fieldinput {background: #fff;
resize: none;
font-family: exo2;
border: 1px solid #444;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
-o-border-radius: 0px;
-ms-border-radius: 0px;
border-radius: 0px;
}
textarea.fieldinputerror {background: #fcc;
resize: none;
font-family: exo2;
border: 1px solid #f00;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
.sectionframe {
position: relative;
font-family: exo2;
border: 0px outset;
font-size: 10pt;
margin: 3px;
background: #808080;
padding: 0px;
border-radius: 0px;
}
.sectionframe:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 12px;
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
}
.sectionframecontents {
padding: 10px;
text-align: justify;
color: #000000;
border: 1pt inset;
background-color: #F8F8FF;
}
.sectionframeheading {
# background: linear-gradient(to bottom, #fff, #88f);
background: #2099f0;
color: #fff;
border: 1pt outset;
vertical-align: middle;
padding: 5px;
margin: 0px;
font-family: 12pt avenir;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 0px 0px 0px 0px;
}
.sectionframeheading2 {
background: #C0C0C0;
font-family: exo2;
font-size: 20pt;
padding: 3px
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 3px;
}
.heading {background: #fff;
border-radius: 7px 7px 0px 0px;
max-height: 80px;
}
.entryform {
background: #2099f0;
padding: 3px 3px 3px 3px;
margin: 0px;
border: 0px solid black;
border-radius: 0px;
}
.entryform table {
font: 12px exo2;
background: #c5e1f4;
border: 0pt solid black;
}
.footer {
background: linear-gradient(to bottom, #000, #888);
font: 8pt verdana;
color: #FFFFFF;
text-align: center;
border-radius: 0px 0px 6px 6px;}
.menubar {
# background: linear-gradient(to bottom, #fff, #2099f0);
padding: 0px 0px 0px 0px;
margin: 0px;
}
.baritem {
background-image: linear-gradient(#2099f0, #c3ddef);
color: #fff;
position: relative;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 10px 0px 0px 0px;
border: solid;
border-width: 0px 0px 1px 0px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 50%;
z-index: 5;
pointer-events: none;
border-radius: 4px 4px 0px 0px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.baritemselected {
background: #ccc;
color: #000;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 5px 10px 0px 0px;
border: solid;
border-width: 1px 1px 0px 1px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:hover {
background: #c3ddef;
color: #fff;
transition: background 5s;
}
.panel {background: #ccc;
margin: 10px;
padding: 3px;
border: 0pt inset;}
.panel table {
font: 12px exo2;
padding: 5px;
background: #c5e1f4;
border: 1pt solid black;
border-radius: 9px;
}
.panel table th {
background: #2099f0;
color: #fff;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.panel table td {
background: #c5e1f4;
color: #000;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.left {
text-align: right;
padding-left: 20px;
border-radius: 9px 0px 0px 9px;
}
.right {
border-radius: 0px 9px 9px 0px;
padding-right: 20px;
}
.featured {background: #fff}
.buttonbay {
width: 100%;
text-align: center;
}
.fieldinput {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
border: 1px solid #ccc;
}
.fieldinputerror {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
background: #fcc;
border: 1px solid red;
}
.fieldprompt {
font-size: 10pt;
text-align: right;
background: #00f;
}
.message {font: bold 10pt verdana; color: #FF0000}
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
.collection_text {font: 10pt verdana; color: #FFFFFF}
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
.button {
position: relative;
display: inline-block;
font-size: 10pt;
font-weight: 400;
color: #fff;
border: 2px outset;
background: #2099f0;
padding: 2px 10px 3px 10px;
margin: 0px;
border-radius: 5px;
}
.button:after{
content: '';
position: absolute;
top: 0px;
left: 0px;
width: calc(100% - 0px);
height: 10px;
z-index: 5;
border-radius: 3px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.code {
font-family: source;
font-weight: 400;
font-size: 10pt;
border: 1pt solid black;
background: #ff8;
padding: 5px;
}
.controlframe {background: #888;
padding: 5px 5px 15px 10px;
}
.vm {position: relative;
height: 55px;
}
.vmname {position: absolute;
left: 0px; top: 0px;
height: 55px;
}
.vmcover {position: absolute;
left: 15px;
top: 30px;
font: 12px 'Dot Matrix';
background: #bbb;
color: white;
border: 1pt solid white;
border-radius: 5px;
padding: 2px 10px 2px 10px;
}
</style></head><body>
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">Support E-Mail</div>
</div>
</div>
<div style="float: right; text-align: right; margin-right: 10px; margin-top: 5px;"></div>
</div>
<div class="menubar">
<table class="menubar" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td style="border-bottom: 1pt solid #bbb; width: 20px;">&nbsp;</td>
<td class="baritem"><a href="/main">HOME</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/services">SERVICES</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/hosting">HOSTING</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/documents">DOCUMENT MGMT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/siptrunk">SIP TRUNKING</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/vst">VST</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/modular1">MODULAR1</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/modular1_patches">MODULAR1 PATCHES</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/synthedit">SYNTHEDIT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/wordpress">WORDPRESS</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/opensource">OPEN SOURCE</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/contact">CONTACT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
</ifrow>
</if>
<td class="baritem"><a href="/login">LOGIN</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td style="border-bottom: 1pt solid #bbb; width: 10px;">&nbsp;</td>
</tr>
</table>
</div>
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
<a href="/jet">JET</a><br>
<a href="/synthmax">SYNTHMAX</a><br>
<a href="/serverframework">SERVER CORE FRAMEWORK</a>
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="sectionframe"><div class="sectionframeheading"><b>Contact</b></div><div class="sectionframecontents">
<p>Please contact us by phone at <b>(702) 755-8235</b>.</p>
<p>To e-mail us, just enter text below and press the buttons:</p>
<entryform>
<field prompt="Name" type="text" name="name" size="50" maxlength="50">
<field prompt="E-Mail" type="text" name="email" size="50" maxlength="50">
<field prompt="Message" type="multiline" name="message" rows="5" cols="60">
<captcha>
<buttonbay>
Send Message
</buttonbay>
</entryform>
<messages>
<script src='https://www.google.com/recaptcha/api.js'></script>
</div></div>
</div>
<div style="clear: both;"></div>
</div>
</div>
<div class="footer" style="clear: both;">&copy; 1999-2026 BARANT Systems, All Rights Reserved</div>
</div>
</body></html>
<include file="../src/SESSIONCTL.tag">
<include file="../src/barant.tag">
<include file="../src/project.tag">
<set name="host" value="localhost">
<set name="database" value="barant">
<set name="user" value="barant">
<set name="password" value="uversa1960">
<database name="$[database]" host="$[host]" user="$[user]" password="$[password]" sessionid="">
<sessionctl page="help">
<defaultnav>
<setpage name="help">
</defaultnav>
<link rel="stylesheet" href="/assets/main.css">
<link rel="stylesheet" href="/assets/control.css">
</sessionctl>
</database>
+6 -11
View File
@@ -1,4 +1,3 @@
#api GET /hosting
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>HOSTING</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">HOSTING</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,14 +463,10 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<retain name="sku">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Virtual Machine Hosting</b></div><div class="sectionframecontents">
<p>We offer several virtual machine hosting options. Everything to run your business.</p>
@@ -531,7 +526,7 @@ telephony solution.</p>
<hr>
</div></div>
<set name="pagemenu" value="davidarant" />
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /jet
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>barant.com - JET Extension Tags</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">barant.com - JET Extension Tags</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div class="sectionframe"><div class="sectionframeheading"><b>JET Extension Tags</b></div><div class="sectionframecontents">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content"><div class="sectionframe"><div class="sectionframeheading"><b>JET Extension Tags</b></div><div class="sectionframecontents">
<p>Complete reference documentation go <a href="/jet/contents">here</a>.</p>
@@ -523,7 +518,7 @@ identifier.</li>
<li>Pretty URLS with clean navigation.</li>
</ul>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
-506
View File
@@ -1,506 +0,0 @@
#api GET /main
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>BARANT Technology Group</title><style>
.rotate {
animation: rotation 1s infinite linear;
}
@keyframes rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(359deg);
}
}
@font-face {
font-family: avenir;
src: url('data:font/ttf;base64,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 truncated
}
@font-face {
font-family: source;
src: url('data:font/ttf;base64,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 truncated
}
@font-face {
font-family: exo2;
src: url('data:font/otf;base64,T1RUTwALAIAAAwAwQ0ZGIF65aMUAAA4EAACDv0dQT1NyBlyKAACeSAAAYTJHU1VCWwJIAAAAmQgAAAU+T1MvMmqogawAAAEgAAAAYGNtYXC4LHjGAAAGoAAAB0JoZWFkA3NjtwAAALwAAAA2aGhlYQc+BIEAAAD0AAAAJGhtdHg+CUgTAACRxAAAB0RtYXhwAdFQAAAAARgAAAAGbmFtZVDBsvwAAAGAAAAFHnBvc3T/uAAyAAAN5AAAACAAAQAAAAEAQYT55LNfDzz1AAMD6AAAAADQhBABAAAAANCEEAH/c/7tA+EDpwAAAAMAAgAAAAAAAAABAAAD5/83AAAEBf9z/3MD4QABAAAAAAAAAAAAAAAAAAAB0QAAUAAB0QAAAAMByAGQAAMACAKKAlgAAABLAooCWAAAAV4AMgEkAAAAAAUGAAAAAAAAAAACBwAAAAAAAAAAAAAAAFVLV04AQAAg+wICvP83ASsD5wDJIAAAlwAAAAAB5wKyAAAAIAADAAAAFgEOAAEAAAAAAAAATwAAAAEAAAAAAAEABQBPAAEAAAAAAAIAEQBUAAEAAAAAAAMAIABlAAEAAAAAAAQAFwCFAAEAAAAAAAUAPACcAAEAAAAAAAYAFQDYAAEAAAAAAAkADQDtAAEAAAAAAAwAEwD6AAEAAAAAAA4APwENAAMAAQQJAAAAngFMAAMAAQQJAAEAHgHqAAMAAQQJAAIADgIIAAMAAQQJAAMAQAIWAAMAAQQJAAQALgJWAAMAAQQJAAUAeAKEAAMAAQQJAAYAKgL8AAMAAQQJAAkAGgMmAAMAAQQJAAwAJgNAAAMAAQQJAA4AfgNmAAMAAQQJABAACgPkAAMAAQQJABEAIgPuQ29weXJpZ2h0IKkgMjAxNCwgTmF0YW5hZWwgR2FtYSAod3d3Lm5kaXNjb3ZlcmVkLmNvbSAuIGluZm8oYXQpbmRpc2NvdmVyZWQuY29tKUV4byAyUmVndWxhciBDb25kZW5zZWQxLjAwMTtVS1dOO0V4bzItUmVndWxhckNvbmRlbnNlZEV4byAyIFJlZ3VsYXIgQ29uZGVuc2VkVmVyc2lvbiAxLjAwMTtQUyAwMDEuMDAxO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU4MzI5RXhvMi1SZWd1bGFyQ29uZGVuc2VkTmF0YW5hZWwgR2FtYXd3dy5uZGlzY292ZXJlZC5jb21odHRwOi8vc2NyaXB0cy5zaWwub3JnL2Ntcy9zY3JpcHRzL3BhZ2UucGhwP3NpdGVfaWQ9bnJzaSZpZD1PRkwAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADEANAAsACAATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQAgACgAdwB3AHcALgBuAGQAaQBzAGMAbwB2AGUAcgBlAGQALgBjAG8AbQAgAC4AIABpAG4AZgBvACgAYQB0ACkAbgBkAGkAcwBjAG8AdgBlAHIAZQBkAC4AYwBvAG0AKQBFAHgAbwAgADIAIABDAG8AbgBkAGUAbgBzAGUAZABSAGUAZwB1AGwAYQByADEALgAwADAAMQA7AFUASwBXAE4AOwBFAHgAbwAyAC0AUgBlAGcAdQBsAGEAcgBDAG8AbgBkAGUAbgBzAGUAZABFAHgAbwAgADIAIABSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARQB4AG8AMgAtAFIAZQBnAHUAbABhAHIAQwBvAG4AZABlAG4AcwBlAGQATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQB3AHcAdwAuAG4AZABpAHMAYwBvAHYAZQByAGUAZAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBjAG0AcwAvAHMAYwByAGkAcAB0AHMALwBwAGEAZwBlAC4AcABoAHAAPwBzAGkAdABlAF8AaQBkAD0AbgByAHMAaQAmAGkAZAA9AE8ARgBMAEUAeABvACAAMgBSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAAAAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AZUAAAAAAAABlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVAXUBfAF3AZoBrgG2AX0BhQGG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 truncated
}
body {background: linear-gradient(to bottom, #ccc, #444);
font-family: exo2;
margin: 10px 10px 10px 10px;
width: 98%;
}
a:link {text-decoration: none}
a:visited {text-decoration:none}
a:hover {text-decoration:none}
h1 {font: 20pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
color: #808080;
opacity: 0.9;}
h2 {font: 14pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
h3 {font: 12pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
p {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
ul {font-family: 8pt exo2;}
li {font-family: 8pt exo2;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
}
.project_header {background: #88c;
color: #fff;
padding: 5px;
font-weight: 400;
font-size: 14px;
}
.pageclass {background: #fff;
border-radius: 10px;
border: 2pt outset;
border-spacing: 0px;
padding: 0px;
max-width: 1050px;
min-width: 1050px
margin: auto;
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
font-family: exo2;
font-size: 10pt;
}
input {background: #fff;
border: 1px inset;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-o-border-radius: 2px;
-ms-border-radius: 2px;
border-radius: 0px;
}
select {background: #fff;
font-family: exo2;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
border: 1px solid #444;
padding: 1px 2px 1px 2px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
textarea.fieldinput {background: #fff;
resize: none;
font-family: exo2;
border: 1px solid #444;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
-o-border-radius: 0px;
-ms-border-radius: 0px;
border-radius: 0px;
}
textarea.fieldinputerror {background: #fcc;
resize: none;
font-family: exo2;
border: 1px solid #f00;
font-size: 14px;
min-height: 18px;
display: block;
margin-bottom: 3px;
margin-top: 0px;
outline: none;
padding: 2px 2px 2px 5px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
-o-border-radius: 7px;
-ms-border-radius: 7px;
border-radius: 0px;
}
.sectionframe {
position: relative;
font-family: exo2;
border: 0px outset;
font-size: 10pt;
margin: 3px;
background: #808080;
padding: 0px;
border-radius: 0px;
}
.sectionframe:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 12px;
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
}
.sectionframecontents {
padding: 10px;
text-align: justify;
color: #000000;
border: 1pt inset;
background-color: #F8F8FF;
}
.sectionframeheading {
# background: linear-gradient(to bottom, #fff, #88f);
background: #2099f0;
color: #fff;
border: 1pt outset;
vertical-align: middle;
padding: 5px;
margin: 0px;
font-family: 12pt avenir;
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 0px 0px 0px 0px;
}
.sectionframeheading2 {
background: #C0C0C0;
font-family: exo2;
font-size: 20pt;
padding: 3px
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
border-radius: 3px;
}
.heading {background: #fff;
border-radius: 7px 7px 0px 0px;
max-height: 80px;
}
.entryform {
background: #2099f0;
padding: 3px 3px 3px 3px;
margin: 0px;
border: 0px solid black;
border-radius: 0px;
}
.entryform table {
font: 12px exo2;
background: #c5e1f4;
border: 0pt solid black;
}
.footer {
background: linear-gradient(to bottom, #000, #888);
font: 8pt verdana;
color: #FFFFFF;
text-align: center;
border-radius: 0px 0px 6px 6px;}
.menubar {
# background: linear-gradient(to bottom, #fff, #2099f0);
padding: 0px 0px 0px 0px;
margin: 0px;
}
.baritem {
background-image: linear-gradient(#2099f0, #c3ddef);
color: #fff;
position: relative;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 10px 0px 0px 0px;
border: solid;
border-width: 0px 0px 1px 0px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:after{
content: '';
position: absolute;
top: 1px;
left: 1px;
width: calc(100% - 2px);
height: 50%;
z-index: 5;
pointer-events: none;
border-radius: 4px 4px 0px 0px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.baritemselected {
background: #ccc;
color: #000;
font-family: exo2;
font-weight: 1000;
font-size: 8pt;
padding: 2px 10px;
margin: 5px 10px 0px 0px;
border: solid;
border-width: 1px 1px 0px 1px;
border-color: #fff;
border-radius: 5px 5px 0px 0px;
border-style: outset;
transition: background 2s;
}
.baritem:hover {
background: #c3ddef;
color: #fff;
transition: background 5s;
}
.panel {background: #ccc;
margin: 10px;
padding: 3px;
border: 0pt inset;}
.panel table {
font: 12px exo2;
padding: 5px;
background: #c5e1f4;
border: 1pt solid black;
border-radius: 9px;
}
.panel table th {
background: #2099f0;
color: #fff;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.panel table td {
background: #c5e1f4;
color: #000;
padding: 2px 3px 3px 3px;
border: 0pt;
}
.left {
text-align: right;
padding-left: 20px;
border-radius: 9px 0px 0px 9px;
}
.right {
border-radius: 0px 9px 9px 0px;
padding-right: 20px;
}
.featured {background: #fff}
.buttonbay {
width: 100%;
text-align: center;
}
.fieldinput {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
border: 1px solid #ccc;
}
.fieldinputerror {
font-family: exo2;
border-radius: 7px;
padding: 2px 2px 2px 5px;
background: #fcc;
border: 1px solid red;
}
.fieldprompt {
font-size: 10pt;
text-align: right;
background: #00f;
}
.message {font: bold 10pt verdana; color: #FF0000}
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
.collection_text {font: 10pt verdana; color: #FFFFFF}
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
.button {
position: relative;
display: inline-block;
font-size: 10pt;
font-weight: 400;
color: #fff;
border: 2px outset;
background: #2099f0;
padding: 2px 10px 3px 10px;
margin: 0px;
border-radius: 5px;
}
.button:after{
content: '';
position: absolute;
top: 0px;
left: 0px;
width: calc(100% - 0px);
height: 10px;
z-index: 5;
border-radius: 3px;
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
}
.code {
font-family: source;
font-weight: 400;
font-size: 10pt;
border: 1pt solid black;
background: #ff8;
padding: 5px;
}
.controlframe {background: #888;
padding: 5px 5px 15px 10px;
}
.vm {position: relative;
height: 55px;
}
.vmname {position: absolute;
left: 0px; top: 0px;
height: 55px;
}
.vmcover {position: absolute;
left: 15px;
top: 30px;
font: 12px 'Dot Matrix';
background: #bbb;
color: white;
border: 1pt solid white;
border-radius: 5px;
padding: 2px 10px 2px 10px;
}
</style></head><body>
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">BARANT Technology Group</div>
</div>
</div>
<div style="float: right; text-align: right; margin-right: 10px; margin-top: 5px;"></div>
</div>
<div class="menubar">
<table class="menubar" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td style="border-bottom: 1pt solid #bbb; width: 20px;">&nbsp;</td>
<td class="baritem"><a href="/main">HOME</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/services">SERVICES</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/hosting">HOSTING</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/documents">DOCUMENT MGMT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/siptrunk">SIP TRUNKING</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/vst">VST</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/modular1">MODULAR1</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/modular1_patches">MODULAR1 PATCHES</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/synthedit">SYNTHEDIT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/wordpress">WORDPRESS</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/opensource">OPEN SOURCE</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td class="baritem"><a href="/contact">CONTACT</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
</ifrow>
</if>
<td class="baritem"><a href="/login">LOGIN</a></td><td style="border-bottom: 1pt solid #bbb;">&nbsp;</td>
<td style="border-bottom: 1pt solid #bbb; width: 10px;">&nbsp;</td>
</tr>
</table>
</div>
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
<a href="/jet">JET</a><br>
<a href="/synthmax">SYNTHMAX</a><br>
<a href="/serverframework">SERVER CORE FRAMEWORK</a>
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="sectionframe"><div class="sectionframeheading"><b>Welcome to BARANT Systems</b></div><div class="sectionframecontents">
<div style="width: 48%;">
<p>We are BARANT Technology Group. Contact us for information on how we can
help you with your technical objectives.</p>
<h1>Modular1 VST Synthesizer</h1>
<p>Check out our <a href="/vst">Modular1 VST3
Synthesizer</a> If you appreciate the art of modular analog
synthesizers then you will really enjoy the Modular1 with all the
features of an analog modular synthesizer put into a single VST3
instrument. With the added features of polyphony and patches that
change instantaneously this synthesizer is truly a powerhouse in the
audio toolbox.</p>
<a href="/vst"><img src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvbW9kdWxhcjEucG5nJyk7PC9zY3JpcHQ+ICAgICAgICAgICAgICA8IURPQ1RZUEUgaHRtbD4gICAgICA8IS0tW2lmIGx0IElFIDcgXT48aHRtbCBjbGFzcz0iaWUgaWU2IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTciIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA4IF0+PGh0bWwgY2xhc3M9ImllIGllOCIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIChndGUgSUUgOSl8IShJRSldPjwhLS0+PGh0bWwgbGFuZz0iZW4iPiA8IS0tPCFbZW5kaWZdLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoZWFkPgogPHRpdGxlPlBhZ2UgTm90IEZvdW5kPC90aXRsZT4KICAgICAgIDxNRVRBIE5BTUU9QVVUSE9SIENPTlRFTlQ9IiI+ICAgICAgIDxNRVRBIE5BTUU9REVTQ1JJUFRJT04gQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1LRVlXT1JEUyBDT05URU5UPSIiPiAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9tYWluLmNzcyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9jc3MvY29udHJvbC5jc3MiPgogPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9wbmciIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbS9pbWFnZXMvZmF2aWNvbi5wbmciPgogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL2NrZWRpdG9yL2NrZWRpdG9yLmpzIj48L3NjcmlwdD4KIDwhLS0gR2xvYmFsIHNpdGUgdGFnIChndGFnLmpzKSAtIEdvb2dsZSBBbmFseXRpY3MgLS0+CiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1HLVQyV1lSUDBDMEgiPjwvc2NyaXB0PgogPHNjcmlwdD4KICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9CiAgZ3RhZygnanMnLCBuZXcgRGF0ZSgpKTsKICBndGFnKCdjb25maWcnLCAnRy1UMldZUlAwQzBIJyk7CiA8L3NjcmlwdD4KICAgICAgICAgICAgIDwvaGVhZD4gICAgICA8Ym9keSAgICAgICAgICAgICA+ICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJfTEFTVFBBR0UiIFZBTFVFPSJtb2R1bGFyMS5wbmciID4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBST0NFU1MiIFZBTFVFPSIiID4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IkVYSVRQUk9DRVNTIiBWQUxVRT0iIiA+CTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkRJUiIgdmFsdWU9IiI+CTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Il9DVExESVIiIHZhbHVlPSIiPgk8SU5QVVQgVFlQRT1ISURERU4gTkFNRT0iUEFHRSIgVkFMVUU9Im1vZHVsYXIxLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdtb2R1bGFyMS5wbmcnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKTsgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0udGFyZ2V0PScnOyIgICAgICAgICAgICAgICAgICAgICAgCQkgICAgICA+PGEgaHJlZj0iL21haW4iPkhPTUU8L2E+PC9BPjwvdGQ+Cjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB0IHNvbGlkICNiYmI7Ij4mbmJzcDs8L3RkPgo8dGQgY2xhc3M9ImJhcml0ZW0iPgo8QSBIUkVGPSJqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUFJPQ0VTUy52YWx1ZT0nJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUEFHRS52YWx1ZT0nbW9kdWxhcjEucG5nJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7ICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnRhcmdldD0nJzsiICAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgPjxhIGhyZWY9Ii9zZXJ2aWNlcyI+U0VSVklDRVM8L2E+PC9BPjwvdGQ+Cjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB0IHNvbGlkICNiYmI7Ij4mbmJzcDs8L3RkPgo8dGQgY2xhc3M9ImJhcml0ZW0iPgo8QSBIUkVGPSJqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUFJPQ0VTUy52YWx1ZT0nJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUEFHRS52YWx1ZT0nLine truncated
<p>Excellent quality and technical performance provide a performance level
instrument for musicians or students who wish to learn sound wave
synthesis techniques or for musicians to enable that old analog sound
in their DAW recording system..</p>
<p>Checkout the product page for more information on the capabilities
of the Modular1 synthesizer.</p>
</div>
</div></div>
</div>
<div style="clear: both;"></div>
</div>
</div>
<div class="footer" style="clear: both;">&copy; 1999-2026 BARANT Systems, All Rights Reserved</div>
</div>
</body></html>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /notfound
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Page Not Found</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">Page Not Found</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,15 +463,11 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<p>Requested page is not found.</p>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /opensource
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>OPEN SOURCE</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">OPEN SOURCE</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Open Source Projects</b></div><div class="sectionframecontents">
<h1>Open Source Projects</h1>
<p>We have several open source projects that we have created.</p>
@@ -520,7 +515,7 @@ firmware code utilizing the RCA1802 micro-controller chip.</li>
Check out our git server at <a href="https://git.barant.com">git.barant.com</a>.
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+6 -11
View File
@@ -1,4 +1,3 @@
#api GET /serverframework
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Server Core Framework</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">Server Core Framework</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Server Core Framework</b></div><div class="sectionframecontents">
<p>It is finally here! The Server Core Framework is now available. The
framework offers support for just about any server you can devise.</p>
@@ -503,14 +498,14 @@ Unty 3D and for the Unreal Engine 4 with drop in and play options that
can be heavily modified to support unique game features. Offers
support for mySQL backends.</p>
<img src="images/ServerCoreMap.png" width="80%">
<img src="/assets/ServerCoreMap.png" width="80%">
<br>
<code>
git clone https://barant.com/git@ServerCore.git
</code>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /services
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>BARANT Technology Group</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">BARANT Technology Group</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>Welcome to BARANT Systems</b></div><div class="sectionframecontents">
@@ -517,7 +512,7 @@ textarea.fieldinputerror {background: #fcc;
</div>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+5 -10
View File
@@ -1,4 +1,3 @@
#api GET /siptrunk
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>SIP Trunking</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">SIP Trunking</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>SIP Trunking</b></div><div class="sectionframecontents">
<h1>For PBX Systems</h1>
<p>Some of the best prices around for adding trunks to your PBX. We
@@ -504,7 +499,7 @@ We can also host a PBX for you as well. Complete functionality
utilizing FreePBX can be provided on the internet so you do not need
to worry about the hardware. We manage and maintain everything for you.
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+8 -13
View File
@@ -1,4 +1,3 @@
#api GET /synthedit
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>SYNTHEDIT</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">SYNTHEDIT</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>SYNTHEDIT</b></div><div class="sectionframecontents">
<h1>Modules</h1>
<p>Several modules are under development for Synthedit 1.4.</p>
@@ -492,9 +487,9 @@ synthesizers. Using a superfast algorithm to generate with precision
the harmonics up to the nyquist limit. Precise control over the amplitude and phase
of each harmonic allows traditional waveforms to be generated without
aliasing problems. </p>
<img src="images/sawtooth.png" width="120px">
<img src="images/square.png" width="120px">
<img src="images/triangle.png" width="120px">
<img src="/assets/sawtooth.png" width="120px">
<img src="/assets/square.png" width="120px">
<img src="/assets/triangle.png" width="120px">
<br>
<p>Individual control over each and every harmonic affords the
generation of many waveforms that require a harmonic purity.</p>
@@ -502,7 +497,7 @@ generation of many waveforms that require a harmonic purity.</p>
</div>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+6 -11
View File
@@ -1,4 +1,3 @@
#api GET /wordpress
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Wordpress Plugins</title><style>
.rotate {
animation: rotation 1s infinite linear;
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
<div class="pageclass">
<div class="heading">
<div style="display: inline-block; width: 500px;">
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
<div style="padding-top: 15px;">
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
<div style="left: 80px; color: #2099f0;">Wordpress Plugins</div>
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
<div style="display: table-row; width: 100%;">
<div style="display: table-cell; border:
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
background-image: url('/assets/grid.png') repeat-x repeat-y;">
<div class="panel" style="width: 200px; display: table-cell; ">
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
<a href="/barantmail">BARANTMAIL</a><br>
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
</div></div>
<comment>
<if value1="$[_login_id]" value2="1" type="eq">
<include file="sessionvar.menu">
</if>
</comment>
</div>
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
<div class="sectionframe"><div class="sectionframeheading"><b>BARANT Shopping Cart for WordPress</b></div><div class="sectionframecontents">
@@ -491,7 +486,7 @@ textarea.fieldinputerror {background: #fcc;
Square, with no WooCommerce required.</p>
</div>
<div style="display: table-cell; vertical-align: top; width: 90px; text-align: center;">
<img src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvc2hvcHBpbmdfY2FydC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9InNob3BwaW5nX2NhcnQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJzaG9wcGluZ19jYXJ0LnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdzaG9wcGluZ19jYXJ0LnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdzaG9wcGluZ19jYXJ0LnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWLine truncated
<img src="/assets/shopping_cart.png" width="64">
</div>
</div>
</div></div>
@@ -534,7 +529,7 @@ touch</a> - BARANT Technology Group can also handle hosting and setup for
you directly.</p>
</div></div>
</div>
</div></div>
<div style="clear: both;"></div>
</div>
</div>
+15 -163
View File
@@ -1,10 +1,3 @@
# --------------------------------------------------------------
# SESSIONCTL lib
#
# Session Control Function Library
#
#
# --------------------------------------------------------------
<tag name="ifadmin">
<if value1="$[__admin__]" value2="1" type="eq">
@@ -18,9 +11,6 @@
</if>
</tag>
#==============================================================================
# RETAIN tag definition.
#==============================================================================
<tag name="retain" keywords="name value empty">
<if value1="#[empty]" value2="" type=eq>
@@ -36,17 +26,8 @@
</if>
</tag>
#==============================================================================
# IFNOTSESSION tag definition.
#==============================================================================
<tag name="ifnotsession">
<if value1="$[_SESSIONID]" value2="" type="eq"><container></if>
</tag>
#------------------------------------------------------------------------------
# LINKBUTTON tag definition.
#------------------------------------------------------------------------------
<tag name="linkbutton" keywords="pagedir page process name name2 value value2 target class multipart">
@@ -93,8 +74,8 @@
document.forms[0].N_LEVEL.value='$[X_LEVEL]';
</IF>
document.forms[0].submit();
document.forms[0].target='';"
document.forms[0].target='';
document.forms[0].requestSubmit();"
<if value1="#[CLASS]" value2="" type="ne">
CLASS="#[CLASS]"
</if>
@@ -102,9 +83,6 @@
</TAG>
#------------------------------------------------------------------------------
# ABUTTON tag definition.
#------------------------------------------------------------------------------
<TAG NAME="ABUTTON" KEYWORDS="PAGE PROCESS NAME VALUE MULTIPART">
<BUTTON ONCLICK="javascript:
@@ -126,81 +104,20 @@
document.forms[0].encoding='multipart/form-data';
</IF>
document.forms[0].submit();">&nbsp;<CONTAINER>&nbsp;</BUTTON>
document.forms[0].requestSubmit();">&nbsp;<CONTAINER>&nbsp;</BUTTON>
</TAG>
# ----------------------------------------------
# CREATESESSION
# ----------------------------------------------
<tag name="createsession" keywords="page timeout">
<if value1="$[_session_id]" value2="" type="ne">
<sql>
delete from sessions
where uuid='$[_session_id]'
</sql>
</if>
<set name="_uuid" expr="uuid()">
<set name="_timestamp" expr="now()">
<if value1="#[timeout]" value2="" type="eq">
<set name="timeout" value="0" scope="local">
</if>
<sql>
insert into sessions
set uuid='$[_uuid]',
timestamp='$[_timestamp]',
timeout_page='#[page]',
timeout=#[timeout]
</sql>
<if value1="#[timeout]" value2="" type="eq">
<setcookie name="_session_id" value="$[_uuid]">
<else>
<setcookie name="_session_id" value="$[_uuid]" timeout="#[timeout]">
</if>
</tag>
# ----------------------------------------------
# ENDSESSION
# ----------------------------------------------
<tag name="endsession">
<if value1="$[_session_id]" value2="" type="ne">
<sql>
delete from sessions
where uuid='$[_session_id]'
</sql>
<setcookie name="_session_id" value="">
</if>
</tag>
#--------------------------------------------------
#SETENV
#--------------------------------------------------
<tag name="setenv" keywords="name">
<if value1="$[_session_id]" value2="" type="ne">
<eval name="_envvalue" scope="local"><container></eval>
<set name="_envvalue" value="#[_envvalue]" format="binary" scope="local">
<sql>
replace into sessionenv
set session_uuid='$[_session_id]',
name='#[name]',
value='#[_envvalue]'
</sql>$[sqlerror]
<eval name="#[name]"><container></eval>
</if>
<set name="#[name]" value="#[_envvalue]">
<set name="@#[name]" value="#[_envvalue]">
</tag>
#--------------------------------------------------
#CLEARENV
#--------------------------------------------------
<tag name="clearenv" keywords="name">
<sql>
DELETE FROM sessionenv WHERE session_uuid='$[_session_id]' AND name='#[name]'
</sql>$[sqlerror]
<SET NAME='#[name]' VALUE="">
<set name="#[name]" value="">
<set name="@#[name]" value="">
</tag>
#--------------------------------------------------
#SETPAGE
#--------------------------------------------------
<tag name="setpage" keywords="NAME DIR">
<SET NAME=PAGE VALUE='#[NAME]'>
<IF VALUE1="#[DIR]" VALUE2="" TYPE="NE">
@@ -209,79 +126,21 @@
</IF>
</TAG>
#--------------------------------------------------
#SETPROCESS
#--------------------------------------------------
<TAG NAME='SETPROCESS' KEYWORDS='VALUE'>
<SET NAME=PROCESS VALUE='#[VALUE]'>
</TAG>
#--------------------------------------------------
#CHECKSESSION
#--------------------------------------------------
<tag name="checksession">
<sql>
select *,
if((timeout > 0) && (unix_timestamp(now()) - unix_timestamp(timestamp) > (timeout * 60)),'0','1') as session_valid
from sessions
where uuid="$[_session_id]"
</sql>$[sqlerror]
<ifrow>
<if value1="$[.session_valid]" value2="1" type="eq">
<set name="session_timestamp" value="$[.timestamp]">
<set name="_timestamp" expr="now()">
<sql>
update sessions
set timestamp='$[_timestamp]'
where uuid="$[_session_id]"
</sql>
<sql>
select * from sessionenv where session_uuid="$[_session_id]"
</sql>$[sqlerror]
<whilerow>
<eval name="$[.name]">$[.value]</eval>
</whilerow>
<else>
<setpage name="$[.timeout_page]">
<set name="_session_id" value="">
</if>
<else>
<setpage name="">
<set name="_session_id" value="">
</ifrow>
<set name="_login_id" value="$[@_login_id]">
<set name="_login_name" value="$[@_login_name]">
<set name="_login_email" value="$[@_login_email]">
<set name="_login_type" value="$[@_login_type]">
<set name="_login_uuid" value="$[@_login_uuid]">
</tag>
#--------------------------------------------------
#FIRST RUN - See FETCHPROC in SESSIONCTL tag
#--------------------------------------------------
<TAG NAME='FIRSTRUN'>
<IF VALUE1='$[_PROCESSRAN]' VALUE2='FALSE' TYPE=EQ>
<EVAL NAME='_FIRSTRUN'>$[_FIRSTRUN] <CONTAINER></EVAL>
</IF>
</TAG>
#--------------------------------------------------
#RUNERROR - See FETCHPROC in SESSIONCTL tag
#--------------------------------------------------
<TAG NAME='RUNERROR'>
<IF VALUE1='$[_PROCESSRAN]' VALUE2='TRUE' TYPE=EQ>
<EVAL NAME="_RUNERROR">$[_RUNERROR] <CONTAINER></EVAL>
</IF>
</TAG>
#--------------------------------------------------
#SESSIONCTL
#--------------------------------------------------
<tag name='sessionctl' keywords="page stylesheet">
<tag name="defaultnav"><if expr="('$[PAGE]' = '') and ('$[PROCESS]' = '')"><eval><container></eval></if></tag>
<database name="$[database]" host="$[host]" user="$[user]" password="$[password]" sessionid="_SESSIONCTL">
@@ -292,10 +151,10 @@
<fetchpage>
</tag>
<tag name="page" keywords="template class onload secure loggedin admin" scope="local">
<tag name="author" scope="local"><eval name="author" scope="parent"><container></eval></tag>
<tag name="author" scope="local"><eval name="AUTHOR" scope="parent"><container></eval></tag>
<tag name="description" scope="local"><container name="description" eval="no" scope="parent"></tag>
<tag name="keywords" scope="local"><container name="keywords" eval="no" scope="parent"></tag>
<tag name="contents" scope="local"><eval name="_body"><container></eval></tag>
<tag name="contents" scope="local"><eval name="_BODY"><container></eval></tag>
<TAG NAME='TEMPLATE' SCOPE=LOCAL>
<tag name="contents" scope="local">
$[_BODY]
@@ -331,7 +190,7 @@ $[_BODY]
</head>
<body <if value1="#[CLASS]" value2="" type="ne">class="#[CLASS]"</if>
<if value1="#[onload]" value2="" type="ne">onload="#[onload]"</if>>
<form method="post" enctype="multipart/form-data">
<form method="post" enctype="multipart/form-data" action="$[REQUEST_URI]">
<INPUT TYPE=HIDDEN NAME="_LASTPAGE" VALUE="$[PAGE]" >
<INPUT TYPE=HIDDEN NAME="PROCESS" VALUE="" >
<INPUT TYPE=HIDDEN NAME="EXITPROCESS" VALUE="$[EXITPROCESS]" >
@@ -361,14 +220,7 @@ $[_BODY]
</TAG>
<tag name="fetchproc">
<tag name="process">
<if value1="$[_TIMESTAMP:0]" value2="$[session_timestamp]" type="eq">
<set name="_PROCESSRAN" value="FALSE">
<else>
<set name="_PROCESSRAN" value="TRUE">
</if>
<eval><container></eval>
<eval>$[_FIRSTRUN]</eval>
<eval>$[_RUNERROR]</eval>
</tag>
<EVAL><INCLUDE FILE="./$[DIR]/$[PROCESS].proc"></EVAL>
</TAG>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<heading>
<title>Barant Systems - West Coast Wing Chun Open House 2014</title>
</heading>
+2 -2
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate" secure="yes" loggedin="yes">
<page secure="yes" loggedin="yes">
<title>ACCOUNT</title>
<contents>
<retain name="download_file">
@@ -46,7 +46,7 @@
<br><span style="font-size: 9pt;"><b>barant.com</b></span>
<br><span style="font-size: 7pt;">IP:</span> <span style="font-size: 9pt; font-family: monospace;">74.80.233.78</span></div>
<div style="float: right; padding: 5px;"><img src="images/power_on.png" width="32"></div>
<div style="float: right; padding: 5px;"><img src="/assets/power_on.png" width="32"></div>
<div style="float: right; width: 90px; height: 48px; background: #444;"></div>
<div style="float: right; margin-right: 25px;">3 days 2:10:33<br><br>34% of 40.2GB</div>
<div style="clear: both;"></div>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>BARANT Systems</title>
<contents>
<sectionframe title="E-Mail Confirmation">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<heading>
<title>The Digital Gods - The MP3 Music Store</title>
</heading>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<menu>
<include file="projects.menu">
<include file="sessionvar.menu">
-4
View File
@@ -1,7 +1,3 @@
<if value1="$[_session_id]" value2="" type="eq">
<createsession>
</if>
$[_session_id]-$[sku]
<sql>select * from cart_item where session_uuid='$[_session_id]' and sku='$[sku]'</sql>
$[sqlerror]
<ifrow><set name="qty" value="$[.quantity]"></ifrow>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate" secure="yes" loggedin="yes" admin="true">
<page secure="yes" loggedin="yes" admin="true">
<title>ADMINISTRATION</title>
<contents>
<eval name="_menu">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate" secure="yes" admin="true" loggedin="yes">
<page secure="yes" admin="true" loggedin="yes">
<title>INVOICE</title>
<contents>
<eval name="_menu">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate" secure="yes" loggedin="yes" admin="true">
<page secure="yes" loggedin="yes" admin="true">
<title>ADMIN INVOICES</title>
<contents>
<eval name="_menu">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>APPLICATIONS</title>
<contents>
<sectionframe title="Project Manager">
+3 -3
View File
@@ -1,9 +1,9 @@
<page template="mainpagetemplate">
<page>
<title>RCA1802 Micro-Controller Assembler/Emulator</title>
<contents>
<sectionframe title="RCA1802">
<h1>The RCA1802 Micro-Controller</h1>
<img src="images/rca1802chip.jpeg" align="right">
<img src="/assets/rca1802chip.jpeg" align="right">
<p>Back in the 1970's RCA released a chip that was widely used in
satellites and other spacecraft to this day. It is a very simple
8-bit micro-controller with 16-bit addressibility enabling memory
@@ -26,7 +26,7 @@ device.</p>
</sectionframe>
<sectionframe title="RCA1802 Emulator">
<img src="images/emu1802a.png" align="right" width="500">
<img src="/assets/emu1802a.png" align="right" width="500">
<p>The 1802 emulator provides a fully functional RCA1802
micro-controller device complete with interupt handling and DMA
controls for memory access. Experiment with code structures and build
+1 -1
View File
@@ -3,7 +3,7 @@
<table width="100% cellpadding="5" cellspacing="0">
<tr>
<td class="featured">
<p><img src="images/organ1.png" align="right"></p>
<p><img src="/assets/organ1.png" align="right"></p>
<p>
<whiledir dir="/var/www/barant/musiclink" name="filename">
<if expr="substring('$[filename]',1,1) != '.'">
+1 -1
View File
@@ -16,7 +16,7 @@
</if>
<div class="sectionframe"><if value1="#[title]" value2="" type="ne">
<div class="$[sectionframeheading]"><b>#[title]</b>
<if value1="#[edit]" value2="true" type="eq"><img src="images/edit.png" width="16"></if></div></if>
<if value1="#[edit]" value2="true" type="eq"><img src="/assets/edit.png" width="16"></if></div></if>
<div class="sectionframecontents"><container></div></div>
</tag>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>BARANTMAIL OPEN SOURCE PROJECT</title>
<contents>
<sectionframe title="BARANTMAIL OPEN SOURCE PROJECT">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<heading>
<title>BARANT Systems</title>
</heading>
+99 -57
View File
@@ -1,79 +1,121 @@
<page template="mainpagetemplate">
<page>
<title>SHOPPING CART</title>
<contents>
<retain name="sku">
<set name="tranonce" expr="unix_timestamp()">
<setenv name="tranonce">$[tranonce]</setenv>
<sectionframe title="SHOPPING CART">
<input type="hidden" name="sku" value="">
<input type="hidden" name="qty" value="">
<script>
function update(input) {
PROCESS.value="updatecartqty";
submit();
function cartQtyChange(sku, qty) {
if (qty === '' || isNaN(qty)) return;
document.forms[0].PROCESS.value = 'updatecartqty';
document.forms[0].PAGE.value = 'cart';
document.forms[0].sku.value = sku;
document.forms[0].qty.value = qty;
document.forms[0].requestSubmit();
}
</script>
<set name="hasrecurring" value="false">
<set name="hasfiles" value="false">
<sql>
select count(*) as number_of_items,
sum(price * quantity) as total
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'
</sql>
$[sqlerror]
<ifrow>
<set name="cart_count" value="$[.number_of_items]">
<set name="cart_total" value="$[.total]">
</ifrow>
<showtable>
select product_list.sku as SKU,
<sectionframe title="Shopping Cart">
<if expr="$[cart_count] > 0">
<sql>
select if(find_in_set('SUBSCRIPTION', group_concat(distinct type)),'true','false') as subscription,
if(find_in_set('FILE', group_concat(distinct type)),'true','false') as file
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'
</sql>
$[sqlerror]
<ifrow>
<set name="cart_has_subscription" value="$[.subscription]">
<set name="cart_has_file" value="$[.file]">
</ifrow>
<if value1="$[cart_has_subscription]" value2="true" type="eq">
<div class="cart-notice">Some items in your cart are recurring subscriptions. You will not be
charged automatically - you'll be notified by e-mail before each renewal, and it's your
responsibility to renew.</div>
</if>
<if value1="$[cart_has_file]" value2="true" type="eq">
<div class="cart-notice">Some items in your cart are downloadable files - available from your
account page after checkout.</div>
</if>
<div class="cart-wrap">
<div class="cart-header">
<div class="cart-col-desc">Item</div>
<div class="cart-col-price">Price</div>
<div class="cart-col-qty">Qty</div>
<div class="cart-col-total">Total</div>
<div class="cart-col-remove"></div>
</div>
<div class="cart-items">
<sql>select product_list.sku as SKU,
description as Description,
quantity as Qty,
price as Price
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'
</showtable>
<br>
order by description</sql>
$[sqlerror]
<whilerow>
<set name="linetotal" expr="$[.Price] * $[.Qty]">
<div class="cart-row">
<div class="cart-col-desc">$[.Description]</div>
<div class="cart-col-price">$$[.Price]</div>
<div class="cart-col-qty">
<input type="number" class="cart-qty-input" min="0" value="$[.Qty]"
onchange="cartQtyChange('$[.SKU]', this.value); return true;">
</div>
<div class="cart-col-total">$$[linetotal]</div>
<div class="cart-col-remove">
<a href="#" class="cart-remove-link" onclick="
document.forms[0].PROCESS.value='removecartitem';
document.forms[0].PAGE.value='cart';
document.forms[0].sku.value='$[.SKU]';
document.forms[0].requestSubmit();
return false;">Remove</a>
</div>
</div>
</whilerow>
</div>
<div class="cart-summary">
<div class="cart-summary-row">
<span>$[cart_count] item<if expr="$[cart_count] != 1">s</if></span>
<span class="cart-summary-total">$$[cart_total]</span>
</div>
</div>
</div>
<comment>//these need to be incorporated into a query.
<if value1="$[.type]" value2="subscription" type="eq">
<set name="hasrecurring" value="true">
</if>
<if value1="$[.type]" value2="file" type="eq">
<set name="hasfiles" value="true">
</if>
</comment>
<div style="text-align: center; width: 100%; margin-top: 10px;">
<linkbutton page="checkout" class="button">Check Out</linkbutton>
</div>
<showtable>
select count(*) as number_of_items,
sum(price * quantity) as total
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'
</showtable>
<sql>
select if(find_in_set('physical', group_concat(distinct type)),'true','false') as physical,
if(find_in_set('file', group_concat(distinct type)),'true','false') as file,
if(find_in_set('subscription', group_concat(distinct type)),'true','false') as subscription
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'
</sql>
<if value1="$[.subscription]" value2="true" type="eq">
<div style="border: 1pt solid black; width: 400px; padding: 5px;">Please note that you have recurring charge items. On the terms of
the recurrence (monthly or annually) you will not be charged
automatically but you will be notified via e-mail that your service is
about to expire. It is your responsibility to renew the services.</div>
<else>
<div class="cart-empty">
<div class="cart-empty-icon">&#128722;</div>
<div class="cart-empty-title">Your cart is empty</div>
<div class="cart-empty-text">Items you add will show up here.</div>
</div>
</if>
<if value1="$[.file]" value2="true" type="eq">
<div style="margin-top: 3px; width: 400px; border: 1pt solid black; padding: 5px;">Please note that
you have purchased items that must be downloaded from your account
page after you checkout.</div>
</if>
<br>
<div style="text-align: center; width: 100%">
<linkbutton page="checkout" class="button">Check
Out</linkbutton></div>
<div style="clear:both;"></div>
<br>
</sectionframe>
</contents>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<contents>
<sectionframe title="Change Project Icon">
+77 -16
View File
@@ -1,7 +1,7 @@
<page template="mainpagetemplate" loggedin="yes">
<page loggedin="yes">
<title>SHOPPING CART - CHECKOUT</title>
<script src="https://web.squarecdn.com/v1/square.js"></script>
<contents>
<script src="https://web.squarecdn.com/v1/square.js"></script>
<script>
function processCardForm(token) {
xhr = new XMLHttpRequest();
@@ -11,8 +11,12 @@
console.log(">" + this.responseText + "<");
if(this.responseText == "OK\n") {
document.forms[0].PAGE.value = 'thankyou';
document.forms[0].submit();
document.forms[0].requestSubmit();
} else {
var payBtn = document.getElementById('pay');
payBtn.disabled = false;
var processbanner = document.getElementById('process');
processbanner.style.visibility = 'hidden';
message.innerText = this.responseText;
}
};
@@ -24,37 +28,94 @@
let payments = Square.payments('sq0idp-V4R4vEferpF9kr7d5x5abQ','LV0MRENX5ED3Z');
const card = await payments.card({
style: {
'.input-container.is-focus': { borderColor: '#006AFF' },
'.message-text.is-error': { color: '#BF0020' }
input: {
backgroundColor: '#1c1c24',
color: '#e7e4dc',
fontSize: '14px'
},
'input::placeholder': { color: '#8d8c92' },
'.input-container': { borderColor: 'rgba(197, 164, 90, 0.28)' },
'.input-container.is-focus': { borderColor: '#c5a45a' },
'.input-container.is-error': { borderColor: '#a13a3a' },
'.message-text': { color: '#8d8c92' },
'.message-text.is-error': { color: '#a13a3a' }
}
});
await card.attach('#card');
let button = document.getElementById('pay');
button.addEventListener('click', async () => {
message.innerText = '';
let result = await card.tokenize();
if (result.status === 'OK') {
button.disabled = true;
let processbanner = document.getElementById('process');
processbanner.style.visibility = 'visible';
processCardForm(result.token);
} else {
let errorMessage = 'Please check your card details and try again.';
if (result.errors && result.errors.length && result.errors[0].message)
errorMessage = result.errors[0].message;
message.innerText = errorMessage;
}
});
}
buildForm();
</script>
<sql>select count(*) as number_of_items,
sum(price * quantity) as total
<sql>select sum(price * quantity) as total
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'</sql>
$[sqlerror]
<ifrow>
<set name="checkout_total" value="$[.total]">
</ifrow>
<sectionframe title="Order Summary">
<sql>select product_list.sku as SKU,
description as Description,
quantity as Qty,
price as Price
from product_list
join cart_item on product_list.sku=cart_item.sku
where cart_item.session_uuid='$[_session_id]'
</sql>
<sectionframe title="Pay with Credit Card">
<div>Please enter your payment information:</div>
<div style="font-size: 20px;">$[total]</div>
<div id="card" style="background-color: #ddd;width: 300px; padding: 5px;"></div>
<div style="padding: 5px;"><button id= "pay" type="button">Pay</button></div>
<div id="process" style="background-color: #0f0; border: 2px solid #000; padding:
5px; display: block-inline; margin: 10px; visibility: hidden;"> Processing Payment - Please wait... </div>
<div id="message" style="color: #f00; margin-top: 20px;"></div>
order by description</sql>
$[sqlerror]
<div class="cart-wrap">
<div class="checkout-header">
<div class="cart-col-desc">Item</div>
<div class="cart-col-price">Price</div>
<div class="checkout-col-qty">Qty</div>
<div class="cart-col-total">Total</div>
</div>
<div class="cart-items">
<whilerow>
<set name="linetotal" expr="$[.Price] * $[.Qty]">
<div class="checkout-row">
<div class="cart-col-desc">$[.Description]</div>
<div class="cart-col-price">$$[.Price]</div>
<div class="checkout-col-qty">$[.Qty]</div>
<div class="cart-col-total">$$[linetotal]</div>
</div>
</whilerow>
</div>
<div class="cart-summary">
<div class="cart-summary-row">
<span>Total Due</span>
<span class="cart-summary-total">$$[checkout_total]</span>
</div>
</div>
</div>
</sectionframe>
<sectionframe title="Payment">
<div class="checkout-pay-wrap">
<div class="checkout-pay-label">Card Details</div>
<div id="card" class="checkout-card-input"></div>
<button id="pay" type="button" class="button checkout-pay-btn">Pay $$[checkout_total]</button>
<div id="process" class="checkout-processing">Processing Payment &mdash; Please wait&hellip;</div>
<div id="message" class="checkout-error"></div>
</div>
</sectionframe>
</contents>
</page>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>Support E-Mail</title>
<contents>
<sectionframe title="Contact">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<contents>
<sectionframe title="Create Project">
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<contents>
<sectionframe title="Create Release Target">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<contents>
<projectheader />
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<contents>
<sectionframe title="Create Task">
+1 -1
View File
@@ -17,6 +17,6 @@ alt="Buy now with PayPal" /></td>
<messages>
<div id="processing" style="position: absolute; background: white; visibility: hidden; top:280px; left: 400px; display: inline-block; padding: 0px 10px 0px 10px; border: 1pt solid black; border-radius: 5px;">
<img class="rotate" src="/images/spinning.png" width="50" align="center">
<img class="rotate" src="/assets/spinning.png" width="50" align="center">
<span style="padding: 0px 0px 0px 10px; font-size: 16px"> PROCESSING...</span>
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>CRYSTAL</title>
<contents>
<setenv name="_menubar"></setenv>
+2 -2
View File
@@ -1,9 +1,9 @@
<page template="mainpagetemplate">
<page>
<heading>
<title>barant.com - David Eugene Arant</title>
</heading>
<contents>
<img src="images/arant2.jpg" align="left">
<img src="/assets/arant2.jpg" align="left">
<h1>David Eugene Arant</h1>
<p>David Eugene Arant was born in South Gate California on April 17th, 1935
to parents May L. Arant and Francis M. Arant.</p>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>Document Management</title>
<style>
.price {display: table-cell;
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate" secure="yes" loggedin="yes" admin="true">
<page secure="yes" loggedin="yes" admin="true">
<title>ADMIN INVOICES</title>
<contents>
<database host="$[host]" name="$[database]" user="$[user]" password="$[password]" sessionid="1">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<contents>
$[_project_header]
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<menu>
<include file="projects.menu">
<include file="sessionvar.menu">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>Support E-Mail</title>
<contents>
<sectionframe title="Contact">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>HOSTING</title>
<contents>
<retain name="sku">
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>Barant Systems</title>
<contents>
<include file="barantstream.section">
+1 -1
View File
@@ -10,7 +10,7 @@
where i.id=$[_invoice_id]</sql>
<set name="amount" value="$[.amount]">
<div style="width: 500px; border: 1pt solid #000; padding: 3px; background: #fff;">
<div><div style="display: inline-block;"><img style="width: 300px;" src="images/invoice_logo.png"></div>
<div><div style="display: inline-block;"><img style="width: 300px;" src="/assets/invoice_logo.png"></div>
<div style="display: flex; float: right; align-items: center;">
Invoice: $[.invnumber] $[.status]
</div>
+1 -1
View File
@@ -12,7 +12,7 @@
where i.id=30</sql>
<set name="amount" value="$[.amount]">
<div style="width: 500px; border: 1pt solid #000; padding: 3px;">
<div><div style="display: inline-block;"><img style="width: 50px;" src="images/btglogo.png"></div>
<div><div style="display: inline-block;"><img style="width: 50px;" src="/assets/btglogo.png"></div>
<div style="display: inline-block;">
<div>BARANT TECHNLOGY GROUP</div>
<div>INVOICE</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<page template="mainpagetemplate">
<page>
<title>barant.com - JET Extension Tags</title>
<contents>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> COMMENT</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> COMMENT</h2>
<hr>
<p>Use the COMMENT tag to prevent JET from recognizing and forwarding
the contents to the output. This is not the same as an HTML command
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CONTAINER</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CONTAINER</h2>
<hr>
<p>Use the CONTAINER tag inside a TAG set to insert the contents of
the define macro tag into the output stream. </p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> DATABASE</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> DATABASE</h2>
<hr>
<p>Use the DATABASE tag to gain access to the mySQL database specified in the tag arguments.
Access to the database is only available inside the container of this tag.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
+1 -1
View File
@@ -1,6 +1,6 @@
<sectionframe title="JET Command Reference">
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
<hr>
<p>Use the CALL tag to transfer control to an executable file on the
host system. Use a fully qualified name for the executable file.</p>
Loaded 100 of 161 files, more files were not shown because too many files have changed in this diff. Show more