",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width
i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t(""),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth
t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
+},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/**
+ * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
+ * Licensed under MIT
+ * @author Ariel Flesler
+ * @version 2.1.2
+ */
+;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference ",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017
+ * http://www.smartmenus.org/
+ * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$(" ").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$(' ')[0],$(' ')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});
\ No newline at end of file
diff --git a/docs/html/main_8cpp.html b/docs/html/main_8cpp.html
new file mode 100644
index 0000000..b2b0c08
--- /dev/null
+++ b/docs/html/main_8cpp.html
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+DBC framework: main.cpp File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+More...
+
#include <iostream>
+
#include <iomanip>
+
#include <memory>
+
#include <vector>
+
#include <cstddef>
+
#include "dbc_parser.h "
+
#include "dbc_tree_builder.h "
+
#include "dbc_decode_builder.h "
+
#include "dbc_decoder.h "
+
+
Go to the source code of this file.
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+
Definition in file main.cpp .
+
+
+
◆ main()
+
+
+
+
+
+ int main
+ (
+ int
+ argc ,
+
+
+
+
+ char *
+ argv []
+
+
+
+ )
+
+
+
+
+
+
+
◆ PrintDecodedFrame()
+
+
+
+
◆ PrintTree()
+
+
+
+
+
+
+
+
+ static void PrintTree
+ (
+ const TreeNode *
+ node ,
+
+
+
+
+ int
+ indent
+
+
+
+ )
+
+
+
+
+
+static
+
+
+
+
+
Definition at line 23 of file main.cpp .
+
+
References FrameInfo::canId , FrameInfo::dlc , Frame , TreeNode::GetChild() , TreeNode::GetChildCount() , TreeNode::GetFrame() , TreeNode::GetName() , TreeNode::GetSignal() , TreeNode::GetType() , FrameInfo::hasPgn , FrameInfo::isExtended , SignalInfo::length , FrameInfo::pgn , PrintTree() , Root , Signal , SignalInfo::startBit , and SignalInfo::unit .
+
+
Referenced by main() , and PrintTree() .
+
+
+
+
+
+
+
+
diff --git a/docs/html/main_8cpp_source.html b/docs/html/main_8cpp_source.html
new file mode 100644
index 0000000..dd07911
--- /dev/null
+++ b/docs/html/main_8cpp_source.html
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+DBC framework: main.cpp Source File
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Go to the documentation of this file.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
27 for (
int i = 0; i < indent; ++i)
+
+
+
+
+
32 std::cout <<
"[root] " << node->
GetName () <<
"\n" ;
+
+
+
+
+
37 std::cout <<
"[frame] " << node->
GetName ();
+
+
39 if (frame !=
nullptr ) {
+
40 std::cout <<
" id=0x" << std::hex << frame->
canId << std::dec
+
41 <<
" ext=" << (frame->
isExtended ?
"yes" :
"no" )
+
42 <<
" dlc=" <<
static_cast< unsigned int > (frame->
dlc );
+
+
+
45 std::cout <<
" pgn=" << frame->
pgn ;
+
+
+
+
+
+
+
+
+
54 std::cout <<
"[signal] " << node->
GetName ();
+
+
56 if (signal !=
nullptr ) {
+
57 std::cout <<
" start=" << signal->
startBit
+
58 <<
" len=" << signal->
length
+
59 <<
" unit=" << signal->
unit ;
+
+
+
+
+
+
+
+
67 std::cout <<
"[unknown]\n" ;
+
+
+
+
+
+
+
+
+
+
77 std::cout <<
"No frame definition found.\n" ;
+
+
+
+
81 std::cout <<
"Decoded frame: " << decoded.
definition ->
name <<
"\n" ;
+
+
83 for (std::size_t index = 0U; index < decoded.
signals .size(); ++index) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
97 int main (
int argc,
char *argv[]) {
+
+
99 std::cerr <<
"Usage: dbc_demo <file.dbc>\n" ;
+
+
+
+
+
+
+
+
+
108 std::unique_ptr<TreeNode> root = treeBuilder.
Build (database);
+
+
110 std::cout <<
"=== Parsed tree ===\n" ;
+
+
+
+
+
+
+
+
+
+
+
121 rawFrame.
canId = decodeDatabase.
frames .empty() ? 0U : decodeDatabase.
frames [0].canId;
+
+
123 rawFrame.
data .resize (8U, 0U);
+
+
+
+
+
128 std::cout <<
"\n=== Decoded frame ===\n" ;
+
+
130 }
catch (
const std::exception &ex) {
+
131 std::cerr <<
"Error: " << ex.what() <<
"\n" ;
+
+
+
+
+
+
Converts parsed DBC data into runtime decode database.
+
DecodeDatabase Build(const DbcDatabase &source) const
Build runtime decode database.
+
Runtime CAN decoder using prebuilt decode database.
+
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
+
+
DbcDatabase ParseFile(const std::string &filePath) const
Parse DBC file.
+
Builds a simple tree from parsed DBC database.
+
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
+
Tree node for later use in model/view or other hierarchy consumers.
+
const SignalInfo * GetSignal() const
Get signal payload if node is signal.
+
const TreeNode * GetChild(std::size_t index) const
Get child by index.
+
const std::string & GetName() const
Get display name.
+
std::size_t GetChildCount() const
Get child count.
+
NodeType GetType() const
Get node type.
+
const FrameInfo * GetFrame() const
Get frame payload if node is frame.
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
int main(int argc, char *argv[])
+
static void PrintDecodedFrame(const DecodedFrameValue &decoded)
+
static void PrintTree(const TreeNode *node, int indent)
+
Parsed DBC content stored in a simple internal form.
+
Runtime decode database with fast lookup by CAN ID.
+
std::vector< DecodeFrame > frames
+
+
+
+
+
+
const DecodeFrame * definition
+
std::vector< DecodedSignalValue > signals
+
One decoded signal value.
+
+
+
+
const DecodeSignal * definition
+
Describes one CAN frame from a DBC file.
+
+
+
+
+
+
Raw CAN frame used for runtime or trace decoding.
+
std::vector< std::uint8_t > data
+
+
+
Describes one signal inside a DBC frame.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/md_README.html b/docs/html/md_README.html
new file mode 100644
index 0000000..f6dd088
--- /dev/null
+++ b/docs/html/md_README.html
@@ -0,0 +1,740 @@
+
+
+
+
+
+
+
+DBC framework: DBC Parser and Runtime Decode Module Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+Overview
+
This module provides a minimal but extensible DBC parser and runtime decode foundation for the FrameTap project.
+
Its purpose is to:
+
+parse DBC files
+store parsed frame and signal metadata
+build a tree for future UI integration
+build a runtime-ready decode database
+decode live CAN frames
+decode CAN trace records using the same decoder
+
+
The implementation follows a simple and practical design:
+
+parser logic is separated from UI logic
+runtime decode structures are separated from tree structures
+Qt is not required at the parser or decoder level
+the same decode engine can be reused for live traffic and trace replay
+
+
This is not a full production-grade DBC implementation yet , but it is a strong architectural base.
+
+
+High-Level Architecture
+
The module is divided into two main paths.
+
+1. Parse and UI path
+
Used for:
+
+browsing frames and signals
+later integration with Qt Model/View
+displaying metadata
+
+
Pipeline:
+
DBC file
+
↓
+
DbcParser
+
↓
+
DbcDatabase
+
↓
+
DbcTreeBuilder
+
↓
+
TreeNode hierarchy
+
↓
+
future Qt UI
+
+2. Runtime decode path
+
Used for:
+
+live CAN decoding
+CAN trace decoding
+fast lookup by CAN ID
+
+
Pipeline:
+
DBC file
+
↓
+
DbcParser
+
↓
+
DbcDatabase
+
↓
+
DbcDecodeBuilder
+
↓
+
DecodeDatabase
+
↓
+
DbcDecoder
+
↓
+
Decoded values
+
This separation is intentional.
+
The tree is useful for UI, but it is not the main data structure for runtime decoding.
+
+
+Why the Runtime Decode Layer Exists
+
A tree structure is convenient for browsing, but a runtime decoder needs something different:
+
+fast lookup by CAN ID
+direct access to signal decode definitions
+minimal overhead during repeated decoding
+the same logic for live frames and trace frames
+
+
Because of that, the design uses a dedicated runtime-ready structure:
+
+
This avoids forcing UI-oriented structures into a decode role they were not meant for.
+
+
+Module Layout
+
+Parsed DBC structures
+
Files:
+
+
These store a readable representation of the parsed DBC file.
+
+UI tree structures
+
Files:
+
+
These convert parsed DBC content into a tree hierarchy suitable for UI and model/view usage later.
+
+Runtime decode structures
+
Files:
+
+
These convert parsed DBC content into a structure optimized for decoding.
+
+Runtime decoder
+
Files:
+
+
These perform actual decoding of raw CAN frames using DecodeDatabase .
+
+Parser
+
Files:
+
+
These parse the DBC file itself.
+
+Demo
+
File:
+
+
Used as a small integration example.
+
+
+Parsed Data Structures
+
+<tt>SignalInfo</tt>
+
Represents one signal as parsed from the DBC file.
+
Fields:
+
+name
+startBit
+length
+isLittleEndian
+isSigned
+factor
+offset
+minimum
+maximum
+unit
+receivers
+comment
+
+
Notes:
+
+receivers is a list because a signal may have more than one receiver ECU
+factor and offset define physical conversion
+this structure is close to DBC content and easy to inspect
+
+
Physical value rule:
+
physical = raw * factor + offset
+
+
+<tt>FrameInfo</tt>
+
Represents one frame as parsed from the DBC file.
+
Fields:
+
+name
+canId
+isExtended
+pgn
+hasPgn
+dlc
+transmitter
+comment
+signals
+
+
Notes:
+
+signals is a list of SignalInfo
+isExtended is determined during CAN ID normalization
+pgn is derived using simplified J1939 logic when applicable
+
+
+
+<tt>DbcDatabase</tt>
+
Top-level parsed DBC container.
+
Conceptually:
+
DbcDatabase
+
└── vector<FrameInfo>
+
This is the central structure produced by DbcParser .
+
+
+UI Tree Layer
+
+<tt>TreeNode</tt>
+
The UI tree contains three node types:
+
+
Example hierarchy:
+
dbc
+
├── EngineData
+
│ ├── EngineSpeed
+
│ ├── OilTemp
+
│ └── CoolantTemp
+
└── VehicleData
+
├── VehicleSpeed
+
└── Odometer
+
Each node stores either:
+
+
The tree is intended for browsing and later Qt model integration.
+
It is not the primary runtime decode structure.
+
+
+Runtime Decode Layer
+
+Purpose
+
The decode layer exists so that decoding can be fast and independent from UI concerns.
+
Instead of searching a tree, the decoder uses a prepared database with direct lookup.
+
+
+<tt>ByteOrder</tt>
+
Runtime byte order enum:
+
+
This is better for decode code than passing around raw DBC characters.
+
+
+<tt>ValueType</tt>
+
Numeric type enum:
+
+
This is clearer than combining multiple boolean flags during runtime logic.
+
+
+<tt>DecodeSignal</tt>
+
Represents one runtime-ready signal definition.
+
Fields:
+
+name
+startBit
+length
+byteOrder
+valueType
+factor
+offset
+minimum
+maximum
+unit
+receivers
+comment
+
+
This structure contains all information required for extracting and converting a signal value from raw frame data.
+
+
+<tt>DecodeFrame</tt>
+
Represents one runtime-ready frame definition.
+
Fields:
+
+name
+canId
+isExtended
+dlc
+pgn
+hasPgn
+transmitter
+comment
+signals
+
+
This structure is used directly by the decoder.
+
+
+<tt>FrameKey</tt>
+
Fast lookup key for runtime frame matching.
+
Fields:
+
+
This matters because the same numeric identifier must not be confused between standard and extended frames.
+
+
+<tt>DecodeDatabase</tt>
+
Top-level runtime decode container.
+
Fields:
+
+frames
+frameIndexByKey
+
+
Conceptually:
+
DecodeDatabase
+
├── vector<DecodeFrame>
+
└── unordered_map<FrameKey, index>
+
This gives the decoder fast access to a frame definition using CAN ID and frame type.
+
+
+Decoder Layer
+
+<tt>RawCanFrame</tt>
+
Represents a raw CAN frame to decode.
+
Fields:
+
+canId
+isExtended
+data
+
+
This same structure can be used for:
+
+live CAN bus input
+replayed trace records
+unit tests
+
+
+
+<tt>DecodedSignalValue</tt>
+
Represents one decoded signal result.
+
Fields:
+
+definition
+rawValue
+physicalValue
+valid
+
+
+
+<tt>DecodedFrameValue</tt>
+
Represents one decoded frame result.
+
Fields:
+
+definition
+signals
+valid
+
+
This is the decoder output for one raw frame.
+
+
+<tt>DbcDecoder</tt>
+
Main runtime decoder class.
+
Responsibilities:
+
+find a frame definition by CAN ID
+decode all signals in a frame
+extract raw values
+sign-extend signed values
+convert raw values into physical values
+
+
Main methods:
+
+FindFrame(...)
+Decode(...)
+
+
+
+Parser Support
+
The current parser supports the following DBC elements:
+
+BO_
+SG_
+CM_ BO_
+CM_ SG_
+
+
+
+Supported DBC Syntax
+
+Frame definition
+
Example:
+
BO_ 256 EngineData: 8 EEC1
+
Parsed fields:
+
+frame CAN ID
+frame name
+DLC
+transmitter ECU
+
+
+
+Signal definition
+
Example:
+
SG_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "rpm" ECU1,ECU2
+
Parsed fields:
+
+signal name
+start bit
+signal length
+byte order
+signedness
+factor
+offset
+minimum
+maximum
+unit
+receivers
+
+
+
+Comments
+
Frame comment example:
+
CM_ BO_ 256 "Engine data frame";
+
Signal comment example:
+
CM_ SG_ 256 EngineSpeed "Actual engine speed";
+
Stored in:
+
+
+
+CAN ID Normalization
+
The parser normalizes frame identifiers.
+
Common DBC behavior:
+
+extended identifiers may be stored with bit 31 set
+the actual 29-bit identifier must be extracted from that value
+
+
The parser therefore stores:
+
+normalized canId
+separate isExtended flag
+
+
This is important both for correct lookup and for future interoperability with live CAN APIs.
+
+
+PGN Extraction
+
PGN is derived only when the frame is treated as extended.
+
The current logic is simplified J1939 extraction:
+
+
This is enough for a practical start but should not be treated as full J1939 validation.
+
+
+Decode Flow
+
Typical runtime decode flow:
+
RawCanFrame
+
↓
+
Find frame in DecodeDatabase
+
↓
+
For each signal:
+
extract raw bits
+
apply sign extension if needed
+
convert to physical value
+
↓
+
DecodedFrameValue
+
+
+Intel and Motorola Extraction
+
The decoder currently has separate extraction paths:
+
+ExtractIntel(...)
+ExtractMotorola(...)
+
+
This is important because byte order is not just metadata once decoding starts.
+
Intel and Motorola require different bit extraction logic.
+
This is one of the main reasons why the runtime decode layer should be explicit and prepared in advance.
+
+
+Example Usage
+
+Parse DBC
+
+
+
+
DbcDatabase ParseFile(const std::string &filePath) const
Parse DBC file.
+
Parsed DBC content stored in a simple internal form.
+
+Build UI tree
+
+
std::unique_ptr<TreeNode> root = treeBuilder.
Build (database);
+
Builds a simple tree from parsed DBC database.
+
std::unique_ptr< TreeNode > Build(const DbcDatabase &database) const
Build tree representation of parsed DBC data.
+
+Build runtime decode database
+
+
+
Converts parsed DBC data into runtime decode database.
+
DecodeDatabase Build(const DbcDatabase &source) const
Build runtime decode database.
+
Runtime decode database with fast lookup by CAN ID.
+
+Decode a raw frame
+
+
+
+
rawFrame.
data = {0x01, 0x02, 0x03, 0x04};
+
+
+
+
Runtime CAN decoder using prebuilt decode database.
+
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
+
+
Raw CAN frame used for runtime or trace decoding.
+
std::vector< std::uint8_t > data
+
+
+
+
+Unified Decode Strategy
+
A key design goal is that the same decoder should work for both:
+
+live CAN frames
+trace replay frames
+
+
That means this architecture supports:
+
+live path
+
live CAN input
+
↓
+
RawCanFrame
+
↓
+
DbcDecoder
+
↓
+
decoded signal values
+
+trace path
+
trace reader
+
↓
+
RawCanFrame
+
↓
+
DbcDecoder
+
↓
+
decoded signal values
+
This avoids duplicating decode logic in two separate parts of the application.
+
+
+Intended Use in FrameTap
+
This module is meant to support at least the following FrameTap workflows:
+
+load a DBC file
+browse frames and signals
+search signals
+drag a signal into a plot later
+decode live CAN traffic
+decode recorded traces
+convert raw values into physical values
+show metadata like units, comments, transmitter, receivers, and PGN
+
+
Example combined workflow:
+
Load DBC
+
↓
+
Parse into DbcDatabase
+
↓
+
Build UI tree
+
↓
+
Build DecodeDatabase
+
↓
+
Use same decode engine for:
+
- live frames
+
- trace replay
+
+
+Why the Tree Is Not Enough
+
The tree exists for browsing.
+
However, runtime decode should not rely on tree traversal because that would introduce unnecessary coupling and inefficiency.
+
A runtime decoder needs:
+
+fast key-based access
+minimal interpretation at decode time
+direct signal definitions already prepared
+
+
That is why DecodeDatabase is a separate layer.
+
+
+Why No Abstract Factory Is Used
+
At the current stage, abstract factory is intentionally avoided.
+
The current design is already clean:
+
parser → parsed database → decode database
+
↘ tree builder → UI tree
+
Introducing factory layers now would increase complexity without solving an immediate problem.
+
If later the project requires multiple output representations or multiple build strategies, that can be added then.
+
+
+Current Limitations
+
This is still a minimal implementation.
+
Not supported yet:
+
+multiplexed signals
+VAL_ tables
+BA_ attributes
+BA_DEF_ definitions
+advanced comment handling
+full DBC grammar coverage
+full J1939 validation
+extensive edge-case handling for unusual DBC formatting
+
+
Motorola extraction is implemented, but it should still be verified carefully against real-world DBC files and expected values.
+
+
+Recommended Next Steps
+
A practical development order would be:
+
+Stage 1 - already implemented
+
+BO_
+SG_
+CM_
+normalized CAN ID
+isExtended
+transmitter
+receivers
+comments
+tree representation
+runtime decode database
+runtime decoder
+
+
+Stage 2
+
Recommended additions:
+
+parent pointer in TreeNode
+Qt model adapter
+VAL_ support for enum-style signals
+better display strings for UI
+selective decoding of only chosen signals
+
+
+Stage 3
+
Recommended additions:
+
+multiplexing support
+attribute parsing
+richer J1939 support
+CSV export of decoded traces
+optimized filtering and signal selection
+
+
+Stage 4
+
Advanced functionality:
+
+live plot integration
+signal subscriptions
+per-signal trace decode pipelines
+decoder-assisted export formats
+
+
+
+Build Integration
+
The module does not depend on any specific build system.
+
It can be integrated with:
+
+CMake
+qmake
+Makefile
+
+
Just add the source files to the project.
+
+
+Summary
+
This module is now split into two intentionally separate layers:
+
+Parsed representation
+
Used for:
+
+storing parsed DBC content
+browsing
+UI tree generation
+
+
+Runtime decode representation
+
Used for:
+
+fast frame lookup
+live CAN decode
+trace decode
+physical value conversion
+
+
That separation is the main architectural improvement.
+
In short, the system now looks like this:
+
DBC parser → DbcDatabase → DecodeDatabase → DbcDecoder
+
↘ TreeNode → future UI
+
This gives FrameTap a much better foundation for real use, because both browsing and decoding are supported without forcing one representation to do the other's job.
+
+
+
+
+
+
diff --git a/docs/html/menudata.js b/docs/html/menudata.js
new file mode 100644
index 0000000..34f2450
--- /dev/null
+++ b/docs/html/menudata.js
@@ -0,0 +1,95 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+*/
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Related Pages",url:"pages.html"},
+{text:"Namespaces",url:"namespaces.html",children:[
+{text:"Namespace List",url:"namespaces.html"},
+{text:"Namespace Members",url:"namespacemembers.html",children:[
+{text:"All",url:"namespacemembers.html"},
+{text:"Functions",url:"namespacemembers_func.html"}]}]},
+{text:"Classes",url:"annotated.html",children:[
+{text:"Class List",url:"annotated.html"},
+{text:"Class Index",url:"classes.html"},
+{text:"Class Members",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"a",url:"functions.html#index_a"},
+{text:"b",url:"functions.html#index_b"},
+{text:"c",url:"functions.html#index_c"},
+{text:"d",url:"functions.html#index_d"},
+{text:"e",url:"functions.html#index_e"},
+{text:"f",url:"functions.html#index_f"},
+{text:"g",url:"functions.html#index_g"},
+{text:"h",url:"functions.html#index_h"},
+{text:"i",url:"functions.html#index_i"},
+{text:"l",url:"functions.html#index_l"},
+{text:"m",url:"functions.html#index_m"},
+{text:"n",url:"functions.html#index_n"},
+{text:"o",url:"functions.html#index_o"},
+{text:"p",url:"functions.html#index_p"},
+{text:"r",url:"functions.html#index_r"},
+{text:"s",url:"functions.html#index_s"},
+{text:"t",url:"functions.html#index_t"},
+{text:"u",url:"functions.html#index_u"},
+{text:"v",url:"functions.html#index_v"},
+{text:"~",url:"functions.html#index__7E"}]},
+{text:"Functions",url:"functions_func.html",children:[
+{text:"a",url:"functions_func.html#index_a"},
+{text:"b",url:"functions_func.html#index_b"},
+{text:"d",url:"functions_func.html#index_d"},
+{text:"e",url:"functions_func.html#index_e"},
+{text:"f",url:"functions_func.html#index_f"},
+{text:"g",url:"functions_func.html#index_g"},
+{text:"i",url:"functions_func.html#index_i"},
+{text:"n",url:"functions_func.html#index_n"},
+{text:"o",url:"functions_func.html#index_o"},
+{text:"p",url:"functions_func.html#index_p"},
+{text:"r",url:"functions_func.html#index_r"},
+{text:"s",url:"functions_func.html#index_s"},
+{text:"t",url:"functions_func.html#index_t"},
+{text:"~",url:"functions_func.html#index__7E"}]},
+{text:"Variables",url:"functions_vars.html",children:[
+{text:"b",url:"functions_vars.html#index_b"},
+{text:"c",url:"functions_vars.html#index_c"},
+{text:"d",url:"functions_vars.html#index_d"},
+{text:"f",url:"functions_vars.html#index_f"},
+{text:"h",url:"functions_vars.html#index_h"},
+{text:"i",url:"functions_vars.html#index_i"},
+{text:"l",url:"functions_vars.html#index_l"},
+{text:"m",url:"functions_vars.html#index_m"},
+{text:"n",url:"functions_vars.html#index_n"},
+{text:"o",url:"functions_vars.html#index_o"},
+{text:"p",url:"functions_vars.html#index_p"},
+{text:"r",url:"functions_vars.html#index_r"},
+{text:"s",url:"functions_vars.html#index_s"},
+{text:"t",url:"functions_vars.html#index_t"},
+{text:"u",url:"functions_vars.html#index_u"},
+{text:"v",url:"functions_vars.html#index_v"}]}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"File Members",url:"globals.html",children:[
+{text:"All",url:"globals.html"},
+{text:"Functions",url:"globals_func.html"},
+{text:"Enumerations",url:"globals_enum.html"}]}]}]}
diff --git a/docs/html/namespaceanonymous__namespace_02dbc__parser_8cpp_03.html b/docs/html/namespaceanonymous__namespace_02dbc__parser_8cpp_03.html
new file mode 100644
index 0000000..f8e36f5
--- /dev/null
+++ b/docs/html/namespaceanonymous__namespace_02dbc__parser_8cpp_03.html
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+DBC framework: anonymous_namespace{dbc_parser.cpp} Namespace Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+std::string TrimText (const std::string &text)
+ Remove leading and trailing spaces. More...
+
+
+
+
+
◆ TrimText()
+
+
+
+
+
+ std::string anonymous_namespace{dbc_parser.cpp}::TrimText
+ (
+ const std::string &
+ text )
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html
new file mode 100644
index 0000000..f61943e
--- /dev/null
+++ b/docs/html/namespacemembers.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+DBC framework: Namespace Members
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Here is a list of all namespace members with links to the namespace documentation for each member:
+
+
+
+
+
diff --git a/docs/html/namespacemembers_func.html b/docs/html/namespacemembers_func.html
new file mode 100644
index 0000000..3d75f1b
--- /dev/null
+++ b/docs/html/namespacemembers_func.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+DBC framework: Namespace Members
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html
new file mode 100644
index 0000000..3a0561d
--- /dev/null
+++ b/docs/html/namespaces.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+DBC framework: Namespace List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Here is a list of all namespaces with brief descriptions:
+
+
+
+
+
diff --git a/docs/html/nav_f.png b/docs/html/nav_f.png
new file mode 100644
index 0000000..72a58a5
Binary files /dev/null and b/docs/html/nav_f.png differ
diff --git a/docs/html/nav_g.png b/docs/html/nav_g.png
new file mode 100644
index 0000000..2093a23
Binary files /dev/null and b/docs/html/nav_g.png differ
diff --git a/docs/html/nav_h.png b/docs/html/nav_h.png
new file mode 100644
index 0000000..33389b1
Binary files /dev/null and b/docs/html/nav_h.png differ
diff --git a/docs/html/open.png b/docs/html/open.png
new file mode 100644
index 0000000..30f75c7
Binary files /dev/null and b/docs/html/open.png differ
diff --git a/docs/html/pages.html b/docs/html/pages.html
new file mode 100644
index 0000000..8f9cce5
--- /dev/null
+++ b/docs/html/pages.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+DBC framework: Related Pages
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
Here is a list of all related documentation pages:
+
+
+
+
+
diff --git a/docs/html/signal__info_8h.html b/docs/html/signal__info_8h.html
new file mode 100644
index 0000000..f41b4db
--- /dev/null
+++ b/docs/html/signal__info_8h.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+DBC framework: signal_info.h File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+More...
+
#include <string>
+#include <vector>
+#include <cstdint>
+
+
Go to the source code of this file.
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+
Definition in file signal_info.h .
+
+
+
+
+
diff --git a/docs/html/signal__info_8h_source.html b/docs/html/signal__info_8h_source.html
new file mode 100644
index 0000000..abdeb3e
--- /dev/null
+++ b/docs/html/signal__info_8h_source.html
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+DBC framework: signal_info.h Source File
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Go to the documentation of this file.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Describes one signal inside a DBC frame.
+
+
+
std::vector< std::string > receivers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png
new file mode 100644
index 0000000..fe895f2
Binary files /dev/null and b/docs/html/splitbar.png differ
diff --git a/docs/html/structDbcDatabase-members.html b/docs/html/structDbcDatabase-members.html
new file mode 100644
index 0000000..ad6b28c
--- /dev/null
+++ b/docs/html/structDbcDatabase-members.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for DbcDatabase , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structDbcDatabase.html b/docs/html/structDbcDatabase.html
new file mode 100644
index 0000000..2068a72
--- /dev/null
+++ b/docs/html/structDbcDatabase.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+DBC framework: DbcDatabase Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Parsed DBC content stored in a simple internal form.
+ More...
+
+
#include <dbc_database.h >
+
+
+
Parsed DBC content stored in a simple internal form.
+
+
Definition at line 22 of file dbc_database.h .
+
+
+
◆ frames
+
+
+
+
+
+ std::vector<FrameInfo > DbcDatabase::frames
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structDecodeDatabase-members.html b/docs/html/structDecodeDatabase-members.html
new file mode 100644
index 0000000..cde9ba8
--- /dev/null
+++ b/docs/html/structDecodeDatabase-members.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for DecodeDatabase , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structDecodeDatabase.html b/docs/html/structDecodeDatabase.html
new file mode 100644
index 0000000..0ac4fbd
--- /dev/null
+++ b/docs/html/structDecodeDatabase.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+DBC framework: DecodeDatabase Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Runtime decode database with fast lookup by CAN ID.
+ More...
+
+
#include <decode_database.h >
+
+
+
Runtime decode database with fast lookup by CAN ID.
+
+
Definition at line 132 of file decode_database.h .
+
+
+
◆ frameIndexByKey
+
+
+
+
◆ frames
+
+
+
+
+
+ std::vector<DecodeFrame > DecodeDatabase::frames
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structDecodeFrame-members.html b/docs/html/structDecodeFrame-members.html
new file mode 100644
index 0000000..4464859
--- /dev/null
+++ b/docs/html/structDecodeFrame-members.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for DecodeFrame , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structDecodeFrame.html b/docs/html/structDecodeFrame.html
new file mode 100644
index 0000000..dec3d42
--- /dev/null
+++ b/docs/html/structDecodeFrame.html
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+DBC framework: DecodeFrame Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Runtime-ready frame definition.
+ More...
+
+
#include <decode_database.h >
+
+
+
Runtime-ready frame definition.
+
+
Definition at line 72 of file decode_database.h .
+
+
+
◆ DecodeFrame()
+
+
+
+
+
+
+
+
+ DecodeFrame::DecodeFrame
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ canId
+
+
+
+
+
+ std::uint32_t DecodeFrame::canId
+
+
+
+
+
+
◆ comment
+
+
+
+
+
+ std::string DecodeFrame::comment
+
+
+
+
+
+
◆ dlc
+
+
+
+
+
+ std::uint8_t DecodeFrame::dlc
+
+
+
+
+
+
◆ hasPgn
+
+
+
+
+
+ bool DecodeFrame::hasPgn
+
+
+
+
+
+
◆ isExtended
+
+
+
+
+
+ bool DecodeFrame::isExtended
+
+
+
+
+
+
◆ name
+
+
+
+
+
+ std::string DecodeFrame::name
+
+
+
+
+
+
◆ pgn
+
+
+
+
+
+ std::uint32_t DecodeFrame::pgn
+
+
+
+
+
+
◆ signals
+
+
+
+
◆ transmitter
+
+
+
+
+
+ std::string DecodeFrame::transmitter
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structDecodeSignal-members.html b/docs/html/structDecodeSignal-members.html
new file mode 100644
index 0000000..10a0df2
--- /dev/null
+++ b/docs/html/structDecodeSignal-members.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for DecodeSignal , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structDecodeSignal.html b/docs/html/structDecodeSignal.html
new file mode 100644
index 0000000..6163042
--- /dev/null
+++ b/docs/html/structDecodeSignal.html
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+DBC framework: DecodeSignal Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Runtime-ready signal definition.
+ More...
+
+
#include <decode_database.h >
+
+
+
Runtime-ready signal definition.
+
+
Definition at line 39 of file decode_database.h .
+
+
+
◆ DecodeSignal()
+
+
+
+
+
+
+
+
+ DecodeSignal::DecodeSignal
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ byteOrder
+
+
+
+
◆ comment
+
+
+
+
+
+ std::string DecodeSignal::comment
+
+
+
+
+
+
◆ factor
+
+
+
+
+
+ double DecodeSignal::factor
+
+
+
+
+
+
◆ length
+
+
+
+
+
+ std::uint32_t DecodeSignal::length
+
+
+
+
+
+
◆ maximum
+
+
+
+
+
+ double DecodeSignal::maximum
+
+
+
+
+
+
◆ minimum
+
+
+
+
+
+ double DecodeSignal::minimum
+
+
+
+
+
+
◆ name
+
+
+
+
+
+ std::string DecodeSignal::name
+
+
+
+
+
+
◆ offset
+
+
+
+
+
+ double DecodeSignal::offset
+
+
+
+
+
+
◆ receivers
+
+
+
+
+
+ std::vector<std::string> DecodeSignal::receivers
+
+
+
+
+
+
◆ startBit
+
+
+
+
+
+ std::uint32_t DecodeSignal::startBit
+
+
+
+
+
+
◆ unit
+
+
+
+
+
+ std::string DecodeSignal::unit
+
+
+
+
+
+
◆ valueType
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structDecodedFrameValue-members.html b/docs/html/structDecodedFrameValue-members.html
new file mode 100644
index 0000000..2573264
--- /dev/null
+++ b/docs/html/structDecodedFrameValue-members.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for DecodedFrameValue , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structDecodedFrameValue.html b/docs/html/structDecodedFrameValue.html
new file mode 100644
index 0000000..2ce38f5
--- /dev/null
+++ b/docs/html/structDecodedFrameValue.html
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+DBC framework: DecodedFrameValue Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Fully decoded frame.
+ More...
+
+
#include <dbc_decoder.h >
+
+
+
Fully decoded frame.
+
+
Definition at line 55 of file dbc_decoder.h .
+
+
+
◆ DecodedFrameValue()
+
+
+
+
+
+
+
+
+ DecodedFrameValue::DecodedFrameValue
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ definition
+
+
+
+
+
+ const DecodeFrame * DecodedFrameValue::definition
+
+
+
+
+
+
◆ signals
+
+
+
+
◆ valid
+
+
+
+
+
+ bool DecodedFrameValue::valid
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structDecodedSignalValue-members.html b/docs/html/structDecodedSignalValue-members.html
new file mode 100644
index 0000000..d0eaab6
--- /dev/null
+++ b/docs/html/structDecodedSignalValue-members.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for DecodedSignalValue , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structDecodedSignalValue.html b/docs/html/structDecodedSignalValue.html
new file mode 100644
index 0000000..0dcf1f8
--- /dev/null
+++ b/docs/html/structDecodedSignalValue.html
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+DBC framework: DecodedSignalValue Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
One decoded signal value.
+ More...
+
+
#include <dbc_decoder.h >
+
+
+
One decoded signal value.
+
+
Definition at line 38 of file dbc_decoder.h .
+
+
+
◆ DecodedSignalValue()
+
+
+
+
+
+
+
+
+ DecodedSignalValue::DecodedSignalValue
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ definition
+
+
+
+
◆ physicalValue
+
+
+
+
+
+ double DecodedSignalValue::physicalValue
+
+
+
+
+
+
◆ rawValue
+
+
+
+
+
+ std::int64_t DecodedSignalValue::rawValue
+
+
+
+
+
+
◆ valid
+
+
+
+
+
+ bool DecodedSignalValue::valid
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structFrameInfo-members.html b/docs/html/structFrameInfo-members.html
new file mode 100644
index 0000000..03dbb8d
--- /dev/null
+++ b/docs/html/structFrameInfo-members.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for FrameInfo , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structFrameInfo.html b/docs/html/structFrameInfo.html
new file mode 100644
index 0000000..770acb0
--- /dev/null
+++ b/docs/html/structFrameInfo.html
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+DBC framework: FrameInfo Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Describes one CAN frame from a DBC file.
+ More...
+
+
#include <frame_info.h >
+
+
+
Describes one CAN frame from a DBC file.
+
+
Definition at line 24 of file frame_info.h .
+
+
+
◆ FrameInfo()
+
+
+
+
+
+
+
+
+ FrameInfo::FrameInfo
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ canId
+
+
+
+
+
+ std::uint32_t FrameInfo::canId
+
+
+
+
+
+
◆ comment
+
+
+
+
+
+ std::string FrameInfo::comment
+
+
+
+
+
+
◆ dlc
+
+
+
+
+
+ std::uint8_t FrameInfo::dlc
+
+
+
+
+
+
◆ hasPgn
+
+
+
+
+
+ bool FrameInfo::hasPgn
+
+
+
+
+
+
◆ isExtended
+
+
+
+
+
+ bool FrameInfo::isExtended
+
+
+
+
+
+
◆ name
+
+
+
+
+
+ std::string FrameInfo::name
+
+
+
+
+
+
◆ pgn
+
+
+
+
+
+ std::uint32_t FrameInfo::pgn
+
+
+
+
+
+
◆ signals
+
+
+
+
+
+ std::vector<SignalInfo > FrameInfo::signals
+
+
+
+
+
+
◆ transmitter
+
+
+
+
+
+ std::string FrameInfo::transmitter
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structFrameKey-members.html b/docs/html/structFrameKey-members.html
new file mode 100644
index 0000000..7310bfc
--- /dev/null
+++ b/docs/html/structFrameKey-members.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for FrameKey , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structFrameKey.html b/docs/html/structFrameKey.html
new file mode 100644
index 0000000..a9e39a4
--- /dev/null
+++ b/docs/html/structFrameKey.html
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+DBC framework: FrameKey Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Key for fast frame lookup.
+ More...
+
+
#include <decode_database.h >
+
+
+
Key for fast frame lookup.
+
+
Definition at line 99 of file decode_database.h .
+
+
+
◆ FrameKey() [1/2]
+
+
+
+
+
+
+
+
+ FrameKey::FrameKey
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
◆ FrameKey() [2/2]
+
+
+
+
+
+
+
+
+ FrameKey::FrameKey
+ (
+ std::uint32_t
+ id ,
+
+
+
+
+ bool
+ extended
+
+
+
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ operator==()
+
+
+
+
+
+
+
+
+ bool FrameKey::operator==
+ (
+ const FrameKey &
+ other )
+ const
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ canId
+
+
+
+
+
+ std::uint32_t FrameKey::canId
+
+
+
+
+
+
◆ isExtended
+
+
+
+
+
+ bool FrameKey::isExtended
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structFrameKeyHasher-members.html b/docs/html/structFrameKeyHasher-members.html
new file mode 100644
index 0000000..4ad2989
--- /dev/null
+++ b/docs/html/structFrameKeyHasher-members.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for FrameKeyHasher , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structFrameKeyHasher.html b/docs/html/structFrameKeyHasher.html
new file mode 100644
index 0000000..9919ed5
--- /dev/null
+++ b/docs/html/structFrameKeyHasher.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+DBC framework: FrameKeyHasher Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Hasher for frame key.
+ More...
+
+
#include <decode_database.h >
+
+
+
Hasher for frame key.
+
+
Definition at line 121 of file decode_database.h .
+
+
+
◆ operator()()
+
+
+
+
+
+
+
+
+ std::size_t FrameKeyHasher::operator()
+ (
+ const FrameKey &
+ key )
+ const
+
+
+
+
+inline
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structRawCanFrame-members.html b/docs/html/structRawCanFrame-members.html
new file mode 100644
index 0000000..1d9410a
--- /dev/null
+++ b/docs/html/structRawCanFrame-members.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for RawCanFrame , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structRawCanFrame.html b/docs/html/structRawCanFrame.html
new file mode 100644
index 0000000..863c3ef
--- /dev/null
+++ b/docs/html/structRawCanFrame.html
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+DBC framework: RawCanFrame Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Raw CAN frame used for runtime or trace decoding.
+ More...
+
+
#include <dbc_decoder.h >
+
+
+
Raw CAN frame used for runtime or trace decoding.
+
+
Definition at line 23 of file dbc_decoder.h .
+
+
+
◆ RawCanFrame()
+
+
+
+
+
+
+
+
+ RawCanFrame::RawCanFrame
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ canId
+
+
+
+
+
+ std::uint32_t RawCanFrame::canId
+
+
+
+
+
+
◆ data
+
+
+
+
+
+ std::vector<std::uint8_t> RawCanFrame::data
+
+
+
+
+
+
◆ isExtended
+
+
+
+
+
+ bool RawCanFrame::isExtended
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/structSignalInfo-members.html b/docs/html/structSignalInfo-members.html
new file mode 100644
index 0000000..f1f700a
--- /dev/null
+++ b/docs/html/structSignalInfo-members.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+DBC framework: Member List
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is the complete list of members for SignalInfo , including all inherited members.
+
+
+
+
+
diff --git a/docs/html/structSignalInfo.html b/docs/html/structSignalInfo.html
new file mode 100644
index 0000000..d8517f6
--- /dev/null
+++ b/docs/html/structSignalInfo.html
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+DBC framework: SignalInfo Struct Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Describes one signal inside a DBC frame.
+ More...
+
+
#include <signal_info.h >
+
+
+
Describes one signal inside a DBC frame.
+
+
Definition at line 22 of file signal_info.h .
+
+
+
◆ SignalInfo()
+
+
+
+
+
+
+
+
+ SignalInfo::SignalInfo
+ (
+ )
+
+
+
+
+
+inline
+
+
+
+
+
+
+
◆ comment
+
+
+
+
+
+ std::string SignalInfo::comment
+
+
+
+
+
+
◆ factor
+
+
+
+
+
+ double SignalInfo::factor
+
+
+
+
+
+
◆ isLittleEndian
+
+
+
+
+
+ bool SignalInfo::isLittleEndian
+
+
+
+
+
+
◆ isSigned
+
+
+
+
+
+ bool SignalInfo::isSigned
+
+
+
+
+
+
◆ length
+
+
+
+
+
+ std::uint32_t SignalInfo::length
+
+
+
+
+
+
◆ maximum
+
+
+
+
+
+ double SignalInfo::maximum
+
+
+
+
+
+
◆ minimum
+
+
+
+
+
+ double SignalInfo::minimum
+
+
+
+
+
+
◆ name
+
+
+
+
+
+ std::string SignalInfo::name
+
+
+
+
+
+
◆ offset
+
+
+
+
+
+ double SignalInfo::offset
+
+
+
+
+
+
◆ receivers
+
+
+
+
+
+ std::vector<std::string> SignalInfo::receivers
+
+
+
+
+
+
◆ startBit
+
+
+
+
+
+ std::uint32_t SignalInfo::startBit
+
+
+
+
+
+
◆ unit
+
+
+
+
+
+ std::string SignalInfo::unit
+
+
+
+
+
The documentation for this struct was generated from the following file:
+
+
+
+
+
diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png
new file mode 100644
index 0000000..3b443fc
Binary files /dev/null and b/docs/html/sync_off.png differ
diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png
new file mode 100644
index 0000000..e08320f
Binary files /dev/null and b/docs/html/sync_on.png differ
diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png
new file mode 100644
index 0000000..3b725c4
Binary files /dev/null and b/docs/html/tab_a.png differ
diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png
new file mode 100644
index 0000000..e2b4a86
Binary files /dev/null and b/docs/html/tab_b.png differ
diff --git a/docs/html/tab_h.png b/docs/html/tab_h.png
new file mode 100644
index 0000000..fd5cb70
Binary files /dev/null and b/docs/html/tab_h.png differ
diff --git a/docs/html/tab_s.png b/docs/html/tab_s.png
new file mode 100644
index 0000000..ab478c9
Binary files /dev/null and b/docs/html/tab_s.png differ
diff --git a/docs/html/tabs.css b/docs/html/tabs.css
new file mode 100644
index 0000000..720b1c6
--- /dev/null
+++ b/docs/html/tabs.css
@@ -0,0 +1,61 @@
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
diff --git a/docs/html/tree__node_8cpp.html b/docs/html/tree__node_8cpp.html
new file mode 100644
index 0000000..4bb189b
--- /dev/null
+++ b/docs/html/tree__node_8cpp.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+DBC framework: tree_node.cpp File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+More...
+
+
Go to the source code of this file.
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+
Definition in file tree_node.cpp .
+
+
+
+
+
diff --git a/docs/html/tree__node_8cpp_source.html b/docs/html/tree__node_8cpp_source.html
new file mode 100644
index 0000000..d71545a
--- /dev/null
+++ b/docs/html/tree__node_8cpp_source.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+DBC framework: tree_node.cpp Source File
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Go to the documentation of this file.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
32 , m_name (signal.name)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tree node for later use in model/view or other hierarchy consumers.
+
+
std::vector< std::unique_ptr< TreeNode > > m_children
+
const SignalInfo * GetSignal() const
Get signal payload if node is signal.
+
const TreeNode * GetChild(std::size_t index) const
Get child by index.
+
void AddChild(std::unique_ptr< TreeNode > child)
Add child node.
+
std::unique_ptr< FrameInfo > m_frame
+
TreeNode()
Create root node.
+
const std::string & GetName() const
Get display name.
+
std::size_t GetChildCount() const
Get child count.
+
+
std::unique_ptr< SignalInfo > m_signal
+
NodeType GetType() const
Get node type.
+
const FrameInfo * GetFrame() const
Get frame payload if node is frame.
+
Describes one CAN frame from a DBC file.
+
Describes one signal inside a DBC frame.
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
NodeType
Type of a tree node.
+
+
+
+
+
+
+
+
diff --git a/docs/html/tree__node_8h.html b/docs/html/tree__node_8h.html
new file mode 100644
index 0000000..ee53ea3
--- /dev/null
+++ b/docs/html/tree__node_8h.html
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+DBC framework: tree_node.h File Reference
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+More...
+
#include <string>
+
#include <vector>
+
#include <memory>
+
#include <cstddef>
+
#include "frame_info.h "
+
#include "signal_info.h "
+
+
Go to the source code of this file.
+
+
+class TreeNode
+ Tree node for later use in model/view or other hierarchy consumers. More...
+
+
+
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+
Definition in file tree_node.h .
+
+
+
◆ NodeType
+
+
+
+
+
Type of a tree node.
+
+Enumerator Root
+ Frame
+ Signal
+
+
+
Definition at line 26 of file tree_node.h .
+
+
+
+
+
+
+
+
diff --git a/docs/html/tree__node_8h_source.html b/docs/html/tree__node_8h_source.html
new file mode 100644
index 0000000..cf19e10
--- /dev/null
+++ b/docs/html/tree__node_8h_source.html
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+DBC framework: tree_node.h Source File
+
+
+
+
+
+
+
+
+
+
+
+
+ DBC framework
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Go to the documentation of this file.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
66 void AddChild (std::unique_ptr<TreeNode> child);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
98 const std::string &
GetName ()
const ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tree node for later use in model/view or other hierarchy consumers.
+
+
std::vector< std::unique_ptr< TreeNode > > m_children
+
const SignalInfo * GetSignal() const
Get signal payload if node is signal.
+
TreeNode(TreeNode &&)=default
+
const TreeNode * GetChild(std::size_t index) const
Get child by index.
+
TreeNode(const TreeNode &)=delete
+
void AddChild(std::unique_ptr< TreeNode > child)
Add child node.
+
std::unique_ptr< FrameInfo > m_frame
+
+
TreeNode()
Create root node.
+
const std::string & GetName() const
Get display name.
+
std::size_t GetChildCount() const
Get child count.
+
+
TreeNode & operator=(const TreeNode &)=delete
+
std::unique_ptr< SignalInfo > m_signal
+
NodeType GetType() const
Get node type.
+
const FrameInfo * GetFrame() const
Get frame payload if node is frame.
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
+
Describes one CAN frame from a DBC file.
+
Describes one signal inside a DBC frame.
+
NodeType
Type of a tree node.
+
+
+
+
+
+
+
+
diff --git a/docs/latex/Makefile b/docs/latex/Makefile
new file mode 100644
index 0000000..07f226d
--- /dev/null
+++ b/docs/latex/Makefile
@@ -0,0 +1,27 @@
+LATEX_CMD?=pdflatex
+MKIDX_CMD?=makeindex
+BIBTEX_CMD?=bibtex
+LATEX_COUNT?=8
+MANUAL_FILE?=refman
+
+all: $(MANUAL_FILE).pdf
+
+pdf: $(MANUAL_FILE).pdf
+
+$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex
+ $(LATEX_CMD) $(MANUAL_FILE)
+ $(MKIDX_CMD) $(MANUAL_FILE).idx
+ $(LATEX_CMD) $(MANUAL_FILE)
+ latex_count=$(LATEX_COUNT) ; \
+ while egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\
+ do \
+ echo "Rerunning latex...." ;\
+ $(LATEX_CMD) $(MANUAL_FILE) ;\
+ latex_count=`expr $$latex_count - 1` ;\
+ done
+ $(MKIDX_CMD) $(MANUAL_FILE).idx
+ $(LATEX_CMD) $(MANUAL_FILE)
+
+
+clean:
+ rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf
diff --git a/docs/latex/README_8md.tex b/docs/latex/README_8md.tex
new file mode 100644
index 0000000..3be9d7a
--- /dev/null
+++ b/docs/latex/README_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{README_8md}{}\doxysection{README.\+md File Reference}
+\label{README_8md}\index{README.md@{README.md}}
diff --git a/docs/latex/annotated.tex b/docs/latex/annotated.tex
new file mode 100644
index 0000000..413ce32
--- /dev/null
+++ b/docs/latex/annotated.tex
@@ -0,0 +1,19 @@
+\doxysection{Class List}
+Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \\*Parsed DBC content stored in a simple internal form }{\pageref{structDbcDatabase}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classDbcDecodeBuilder}{Dbc\+Decode\+Builder}} \\*Converts parsed DBC data into runtime decode database }{\pageref{classDbcDecodeBuilder}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classDbcDecoder}{Dbc\+Decoder}} \\*Runtime CAN decoder using prebuilt decode database }{\pageref{classDbcDecoder}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classDbcParser}{Dbc\+Parser}} \\*Minimal DBC parser }{\pageref{classDbcParser}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classDbcTreeBuilder}{Dbc\+Tree\+Builder}} \\*Builds a simple tree from parsed DBC database }{\pageref{classDbcTreeBuilder}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \\*Runtime decode database with fast lookup by CAN ID }{\pageref{structDecodeDatabase}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \\*Fully decoded frame }{\pageref{structDecodedFrameValue}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}} \\*One decoded signal value }{\pageref{structDecodedSignalValue}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} \\*Runtime-\/ready frame definition }{\pageref{structDecodeFrame}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} \\*Runtime-\/ready signal definition }{\pageref{structDecodeSignal}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \\*Describes one CAN frame from a DBC file }{\pageref{structFrameInfo}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structFrameKey}{Frame\+Key}} \\*Key for fast frame lookup }{\pageref{structFrameKey}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}} \\*Hasher for frame key }{\pageref{structFrameKeyHasher}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} \\*Raw CAN frame used for runtime or trace decoding }{\pageref{structRawCanFrame}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \\*Describes one signal inside a DBC frame }{\pageref{structSignalInfo}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \\*Tree node for later use in model/view or other hierarchy consumers }{\pageref{classTreeNode}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/classDbcDecodeBuilder.tex b/docs/latex/classDbcDecodeBuilder.tex
new file mode 100644
index 0000000..f32bcb4
--- /dev/null
+++ b/docs/latex/classDbcDecodeBuilder.tex
@@ -0,0 +1,62 @@
+\hypertarget{classDbcDecodeBuilder}{}\doxysection{Dbc\+Decode\+Builder Class Reference}
+\label{classDbcDecodeBuilder}\index{DbcDecodeBuilder@{DbcDecodeBuilder}}
+
+
+Converts parsed DBC data into runtime decode database.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+decode\+\_\+builder.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}} (const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&source) const
+\begin{DoxyCompactList}\small\item\em Build runtime decode database. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Converts parsed DBC data into runtime decode database.
+
+Definition at line \mbox{\hyperlink{dbc__decode__builder_8h_source_l00021}{21}} of file \mbox{\hyperlink{dbc__decode__builder_8h_source}{dbc\+\_\+decode\+\_\+builder.\+h}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}\label{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}}
+\index{DbcDecodeBuilder@{DbcDecodeBuilder}!Build@{Build}}
+\index{Build@{Build}!DbcDecodeBuilder@{DbcDecodeBuilder}}
+\doxysubsubsection{\texorpdfstring{Build()}{Build()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} Dbc\+Decode\+Builder\+::\+Build (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{source }\end{DoxyParamCaption}) const}
+
+
+
+Build runtime decode database.
+
+
+\begin{DoxyParams}{Parameters}
+{\em source} & Parsed DBC database. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Runtime-\/ready decode database.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{dbc__decode__builder_8cpp_source}{dbc\+\_\+decode\+\_\+builder.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{decode__database_8h_source_l00043}{Decode\+Signal\+::byte\+Order}}, \mbox{\hyperlink{decode__database_8h_source_l00074}{Decode\+Frame\+::can\+Id}}, \mbox{\hyperlink{frame__info_8h_source_l00026}{Frame\+Info\+::can\+Id}}, \mbox{\hyperlink{decode__database_8h_source_l00051}{Decode\+Signal\+::comment}}, \mbox{\hyperlink{decode__database_8h_source_l00080}{Decode\+Frame\+::comment}}, \mbox{\hyperlink{frame__info_8h_source_l00032}{Frame\+Info\+::comment}}, \mbox{\hyperlink{signal__info_8h_source_l00034}{Signal\+Info\+::comment}}, \mbox{\hyperlink{decode__database_8h_source_l00076}{Decode\+Frame\+::dlc}}, \mbox{\hyperlink{frame__info_8h_source_l00030}{Frame\+Info\+::dlc}}, \mbox{\hyperlink{decode__database_8h_source_l00045}{Decode\+Signal\+::factor}}, \mbox{\hyperlink{signal__info_8h_source_l00028}{Signal\+Info\+::factor}}, \mbox{\hyperlink{decode__database_8h_source_l00134}{Decode\+Database\+::frame\+Index\+By\+Key}}, \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}, \mbox{\hyperlink{decode__database_8h_source_l00133}{Decode\+Database\+::frames}}, \mbox{\hyperlink{decode__database_8h_source_l00078}{Decode\+Frame\+::has\+Pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00029}{Frame\+Info\+::has\+Pgn}}, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}}, \mbox{\hyperlink{decode__database_8h_source_l00075}{Decode\+Frame\+::is\+Extended}}, \mbox{\hyperlink{frame__info_8h_source_l00027}{Frame\+Info\+::is\+Extended}}, \mbox{\hyperlink{signal__info_8h_source_l00026}{Signal\+Info\+::is\+Little\+Endian}}, \mbox{\hyperlink{signal__info_8h_source_l00027}{Signal\+Info\+::is\+Signed}}, \mbox{\hyperlink{decode__database_8h_source_l00042}{Decode\+Signal\+::length}}, \mbox{\hyperlink{signal__info_8h_source_l00025}{Signal\+Info\+::length}}, \mbox{\hyperlink{decode__database_8h_source_l00048}{Decode\+Signal\+::maximum}}, \mbox{\hyperlink{signal__info_8h_source_l00031}{Signal\+Info\+::maximum}}, \mbox{\hyperlink{decode__database_8h_source_l00047}{Decode\+Signal\+::minimum}}, \mbox{\hyperlink{signal__info_8h_source_l00030}{Signal\+Info\+::minimum}}, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{Motorola}}, \mbox{\hyperlink{decode__database_8h_source_l00040}{Decode\+Signal\+::name}}, \mbox{\hyperlink{decode__database_8h_source_l00073}{Decode\+Frame\+::name}}, \mbox{\hyperlink{frame__info_8h_source_l00025}{Frame\+Info\+::name}}, \mbox{\hyperlink{signal__info_8h_source_l00023}{Signal\+Info\+::name}}, \mbox{\hyperlink{decode__database_8h_source_l00046}{Decode\+Signal\+::offset}}, \mbox{\hyperlink{signal__info_8h_source_l00029}{Signal\+Info\+::offset}}, \mbox{\hyperlink{decode__database_8h_source_l00077}{Decode\+Frame\+::pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00028}{Frame\+Info\+::pgn}}, \mbox{\hyperlink{decode__database_8h_source_l00050}{Decode\+Signal\+::receivers}}, \mbox{\hyperlink{signal__info_8h_source_l00033}{Signal\+Info\+::receivers}}, \mbox{\hyperlink{decode__database_8h_source_l00081}{Decode\+Frame\+::signals}}, \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}, \mbox{\hyperlink{decode__database_8h_source_l00041}{Decode\+Signal\+::start\+Bit}}, \mbox{\hyperlink{signal__info_8h_source_l00024}{Signal\+Info\+::start\+Bit}}, \mbox{\hyperlink{decode__database_8h_source_l00079}{Decode\+Frame\+::transmitter}}, \mbox{\hyperlink{frame__info_8h_source_l00031}{Frame\+Info\+::transmitter}}, \mbox{\hyperlink{decode__database_8h_source_l00049}{Decode\+Signal\+::unit}}, \mbox{\hyperlink{signal__info_8h_source_l00032}{Signal\+Info\+::unit}}, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}}, and \mbox{\hyperlink{decode__database_8h_source_l00044}{Decode\+Signal\+::value\+Type}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\+\_\+decode\+\_\+builder.\+h}}\item
+\mbox{\hyperlink{dbc__decode__builder_8cpp}{dbc\+\_\+decode\+\_\+builder.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classDbcDecoder.tex b/docs/latex/classDbcDecoder.tex
new file mode 100644
index 0000000..ebcbd39
--- /dev/null
+++ b/docs/latex/classDbcDecoder.tex
@@ -0,0 +1,171 @@
+\hypertarget{classDbcDecoder}{}\doxysection{Dbc\+Decoder Class Reference}
+\label{classDbcDecoder}\index{DbcDecoder@{DbcDecoder}}
+
+
+Runtime CAN decoder using prebuilt decode database.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $\ast$ \mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{Find\+Frame}} (const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&database, std\+::uint32\+\_\+t can\+Id, bool is\+Extended) const
+\begin{DoxyCompactList}\small\item\em Find frame definition by CAN ID. \end{DoxyCompactList}\item
+\mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}} (const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&database, const \mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} \&frame) const
+\begin{DoxyCompactList}\small\item\em Decode one raw CAN frame. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Private Member Functions}
+\begin{DoxyCompactItemize}
+\item
+static bool \mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{Extract\+Unsigned}} (const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&data, const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} \&signal, std\+::uint64\+\_\+t \&value)
+\item
+static bool \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{Extract\+Intel}} (const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&data, std\+::uint32\+\_\+t start\+Bit, std\+::uint32\+\_\+t length, std\+::uint64\+\_\+t \&value)
+\item
+static bool \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{Extract\+Motorola}} (const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&data, std\+::uint32\+\_\+t start\+Bit, std\+::uint32\+\_\+t length, std\+::uint64\+\_\+t \&value)
+\item
+static std\+::int64\+\_\+t \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{Sign\+Extend}} (std\+::uint64\+\_\+t value, std\+::uint32\+\_\+t bit\+Length)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Runtime CAN decoder using prebuilt decode database.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00070}{70}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}\label{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}}
+\index{DbcDecoder@{DbcDecoder}!Decode@{Decode}}
+\index{Decode@{Decode}!DbcDecoder@{DbcDecoder}}
+\doxysubsubsection{\texorpdfstring{Decode()}{Decode()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} Dbc\+Decoder\+::\+Decode (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&}]{database, }\item[{const \mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}} \&}]{frame }\end{DoxyParamCaption}) const}
+
+
+
+Decode one raw CAN frame.
+
+
+\begin{DoxyParams}{Parameters}
+{\em database} & Runtime decode database. \\
+\hline
+{\em frame} & Raw CAN frame. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Decoded frame value.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{31}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__decoder_8h_source_l00024}{Raw\+Can\+Frame\+::can\+Id}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00026}{Raw\+Can\+Frame\+::data}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00039}{Decoded\+Signal\+Value\+::definition}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00056}{Decoded\+Frame\+Value\+::definition}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Extract\+Unsigned()}}, \mbox{\hyperlink{decode__database_8h_source_l00045}{Decode\+Signal\+::factor}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{Find\+Frame()}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00025}{Raw\+Can\+Frame\+::is\+Extended}}, \mbox{\hyperlink{decode__database_8h_source_l00042}{Decode\+Signal\+::length}}, \mbox{\hyperlink{decode__database_8h_source_l00046}{Decode\+Signal\+::offset}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00041}{Decoded\+Signal\+Value\+::physical\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00040}{Decoded\+Signal\+Value\+::raw\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00057}{Decoded\+Frame\+Value\+::signals}}, \mbox{\hyperlink{decode__database_8h_source_l00081}{Decode\+Frame\+::signals}}, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00144}{Sign\+Extend()}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00042}{Decoded\+Signal\+Value\+::valid}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00058}{Decoded\+Frame\+Value\+::valid}}, and \mbox{\hyperlink{decode__database_8h_source_l00044}{Decode\+Signal\+::value\+Type}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+\mbox{\Hypertarget{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}\label{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}}
+\index{DbcDecoder@{DbcDecoder}!ExtractIntel@{ExtractIntel}}
+\index{ExtractIntel@{ExtractIntel}!DbcDecoder@{DbcDecoder}}
+\doxysubsubsection{\texorpdfstring{ExtractIntel()}{ExtractIntel()}}
+{\footnotesize\ttfamily bool Dbc\+Decoder\+::\+Extract\+Intel (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&}]{data, }\item[{std\+::uint32\+\_\+t}]{start\+Bit, }\item[{std\+::uint32\+\_\+t}]{length, }\item[{std\+::uint64\+\_\+t \&}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00082}{82}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Extract\+Unsigned()}}.
+
+\mbox{\Hypertarget{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}\label{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}}
+\index{DbcDecoder@{DbcDecoder}!ExtractMotorola@{ExtractMotorola}}
+\index{ExtractMotorola@{ExtractMotorola}!DbcDecoder@{DbcDecoder}}
+\doxysubsubsection{\texorpdfstring{ExtractMotorola()}{ExtractMotorola()}}
+{\footnotesize\ttfamily bool Dbc\+Decoder\+::\+Extract\+Motorola (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&}]{data, }\item[{std\+::uint32\+\_\+t}]{start\+Bit, }\item[{std\+::uint32\+\_\+t}]{length, }\item[{std\+::uint64\+\_\+t \&}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00105}{105}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Extract\+Unsigned()}}.
+
+\mbox{\Hypertarget{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}\label{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}}
+\index{DbcDecoder@{DbcDecoder}!ExtractUnsigned@{ExtractUnsigned}}
+\index{ExtractUnsigned@{ExtractUnsigned}!DbcDecoder@{DbcDecoder}}
+\doxysubsubsection{\texorpdfstring{ExtractUnsigned()}{ExtractUnsigned()}}
+{\footnotesize\ttfamily bool Dbc\+Decoder\+::\+Extract\+Unsigned (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::uint8\+\_\+t $>$ \&}]{data, }\item[{const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} \&}]{signal, }\item[{std\+::uint64\+\_\+t \&}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{70}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{decode__database_8h_source_l00043}{Decode\+Signal\+::byte\+Order}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00082}{Extract\+Intel()}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00105}{Extract\+Motorola()}}, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}}, \mbox{\hyperlink{decode__database_8h_source_l00042}{Decode\+Signal\+::length}}, and \mbox{\hyperlink{decode__database_8h_source_l00041}{Decode\+Signal\+::start\+Bit}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Decode()}}.
+
+\mbox{\Hypertarget{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}\label{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}}
+\index{DbcDecoder@{DbcDecoder}!FindFrame@{FindFrame}}
+\index{FindFrame@{FindFrame}!DbcDecoder@{DbcDecoder}}
+\doxysubsubsection{\texorpdfstring{FindFrame()}{FindFrame()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $\ast$ Dbc\+Decoder\+::\+Find\+Frame (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}} \&}]{database, }\item[{std\+::uint32\+\_\+t}]{can\+Id, }\item[{bool}]{is\+Extended }\end{DoxyParamCaption}) const}
+
+
+
+Find frame definition by CAN ID.
+
+
+\begin{DoxyParams}{Parameters}
+{\em database} & Runtime decode database. \\
+\hline
+{\em can\+Id} & Normalized CAN ID. \\
+\hline
+{\em is\+Extended} & true for extended frame. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Pointer to frame definition or nullptr.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{decode__database_8h_source_l00134}{Decode\+Database\+::frame\+Index\+By\+Key}}, and \mbox{\hyperlink{decode__database_8h_source_l00133}{Decode\+Database\+::frames}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Decode()}}.
+
+\mbox{\Hypertarget{classDbcDecoder_a41e89e343338088d27e46773fa52df42}\label{classDbcDecoder_a41e89e343338088d27e46773fa52df42}}
+\index{DbcDecoder@{DbcDecoder}!SignExtend@{SignExtend}}
+\index{SignExtend@{SignExtend}!DbcDecoder@{DbcDecoder}}
+\doxysubsubsection{\texorpdfstring{SignExtend()}{SignExtend()}}
+{\footnotesize\ttfamily std\+::int64\+\_\+t Dbc\+Decoder\+::\+Sign\+Extend (\begin{DoxyParamCaption}\item[{std\+::uint64\+\_\+t}]{value, }\item[{std\+::uint32\+\_\+t}]{bit\+Length }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8cpp_source_l00144}{144}} of file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Decode()}}.
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\item
+\mbox{\hyperlink{dbc__decoder_8cpp}{dbc\+\_\+decoder.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classDbcParser.tex b/docs/latex/classDbcParser.tex
new file mode 100644
index 0000000..30e4c68
--- /dev/null
+++ b/docs/latex/classDbcParser.tex
@@ -0,0 +1,305 @@
+\hypertarget{classDbcParser}{}\doxysection{Dbc\+Parser Class Reference}
+\label{classDbcParser}\index{DbcParser@{DbcParser}}
+
+
+Minimal DBC parser.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+parser.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{Parse\+File}} (const std\+::string \&file\+Path) const
+\begin{DoxyCompactList}\small\item\em Parse DBC file. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Private Member Functions}
+\begin{DoxyCompactItemize}
+\item
+static bool \mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{Is\+Frame\+Line}} (const std\+::string \&line)
+\item
+static bool \mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{Is\+Signal\+Line}} (const std\+::string \&line)
+\item
+static bool \mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{Is\+Comment\+Line}} (const std\+::string \&line)
+\item
+static std\+::string \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{Trim}} (const std\+::string \&text)
+\item
+static std\+::vector$<$ std\+::string $>$ \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{Split\+Receivers}} (const std\+::string \&text)
+\item
+static std\+::uint32\+\_\+t \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{Try\+Extract\+Pgn}} (std\+::uint32\+\_\+t can\+Id, bool is\+Extended, bool \&has\+Pgn)
+\item
+static void \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{Normalize\+Can\+Id}} (std\+::uint32\+\_\+t raw\+Can\+Id, std\+::uint32\+\_\+t \&normalized\+Can\+Id, bool \&is\+Extended)
+\item
+static \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{Parse\+Frame\+Line}} (const std\+::string \&line)
+\item
+static \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{Parse\+Signal\+Line}} (const std\+::string \&line)
+\item
+static void \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{Parse\+Comment\+Line}} (const std\+::string \&line, \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&database)
+\item
+static \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ \mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{Find\+Frame\+By\+Id}} (\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&database, std\+::uint32\+\_\+t can\+Id, bool is\+Extended)
+\item
+static \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ \mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{Find\+Signal\+By\+Name}} (\mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&frame, const std\+::string \&signal\+Name)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Minimal DBC parser.
+
+Supports\+:
+\begin{DoxyItemize}
+\item BO\+\_\+
+\item SG\+\_\+
+\item CM\+\_\+ BO\+\_\+
+\item CM\+\_\+ SG\+\_\+
+\end{DoxyItemize}
+
+Ignores\+:
+\begin{DoxyItemize}
+\item attributes
+\item multiplexing
+\item value tables
+\end{DoxyItemize}
+
+Definition at line \mbox{\hyperlink{dbc__parser_8h_source_l00035}{35}} of file \mbox{\hyperlink{dbc__parser_8h_source}{dbc\+\_\+parser.\+h}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}\label{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}}
+\index{DbcParser@{DbcParser}!FindFrameById@{FindFrameById}}
+\index{FindFrameById@{FindFrameById}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{FindFrameById()}{FindFrameById()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ Dbc\+Parser\+::\+Find\+Frame\+By\+Id (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{database, }\item[{std\+::uint32\+\_\+t}]{can\+Id, }\item[{bool}]{is\+Extended }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00337}{337}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}.
+
+\mbox{\Hypertarget{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}\label{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}}
+\index{DbcParser@{DbcParser}!FindSignalByName@{FindSignalByName}}
+\index{FindSignalByName@{FindSignalByName}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{FindSignalByName()}{FindSignalByName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ Dbc\+Parser\+::\+Find\+Signal\+By\+Name (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&}]{frame, }\item[{const std\+::string \&}]{signal\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00349}{349}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}.
+
+\mbox{\Hypertarget{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}\label{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}}
+\index{DbcParser@{DbcParser}!IsCommentLine@{IsCommentLine}}
+\index{IsCommentLine@{IsCommentLine}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{IsCommentLine()}{IsCommentLine()}}
+{\footnotesize\ttfamily bool Dbc\+Parser\+::\+Is\+Comment\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00079}{79}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_ada086584d371c08dd93b75fb7965f13b}\label{classDbcParser_ada086584d371c08dd93b75fb7965f13b}}
+\index{DbcParser@{DbcParser}!IsFrameLine@{IsFrameLine}}
+\index{IsFrameLine@{IsFrameLine}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{IsFrameLine()}{IsFrameLine()}}
+{\footnotesize\ttfamily bool Dbc\+Parser\+::\+Is\+Frame\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00071}{71}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_ace3d3432a55707bc286a994aa205fed1}\label{classDbcParser_ace3d3432a55707bc286a994aa205fed1}}
+\index{DbcParser@{DbcParser}!IsSignalLine@{IsSignalLine}}
+\index{IsSignalLine@{IsSignalLine}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{IsSignalLine()}{IsSignalLine()}}
+{\footnotesize\ttfamily bool Dbc\+Parser\+::\+Is\+Signal\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00075}{75}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}\label{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}}
+\index{DbcParser@{DbcParser}!NormalizeCanId@{NormalizeCanId}}
+\index{NormalizeCanId@{NormalizeCanId}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{NormalizeCanId()}{NormalizeCanId()}}
+{\footnotesize\ttfamily void Dbc\+Parser\+::\+Normalize\+Can\+Id (\begin{DoxyParamCaption}\item[{std\+::uint32\+\_\+t}]{raw\+Can\+Id, }\item[{std\+::uint32\+\_\+t \&}]{normalized\+Can\+Id, }\item[{bool \&}]{is\+Extended }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00101}{101}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Parse\+Frame\+Line()}}.
+
+\mbox{\Hypertarget{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}\label{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}}
+\index{DbcParser@{DbcParser}!ParseCommentLine@{ParseCommentLine}}
+\index{ParseCommentLine@{ParseCommentLine}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{ParseCommentLine()}{ParseCommentLine()}}
+{\footnotesize\ttfamily void Dbc\+Parser\+::\+Parse\+Comment\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line, }\item[{\mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{database }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{274}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{frame__info_8h_source_l00032}{Frame\+Info\+::comment}}, \mbox{\hyperlink{signal__info_8h_source_l00034}{Signal\+Info\+::comment}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00337}{Find\+Frame\+By\+Id()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00349}{Find\+Signal\+By\+Name()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00101}{Normalize\+Can\+Id()}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_aef72826942c9095d653fafa435855e56}\label{classDbcParser_aef72826942c9095d653fafa435855e56}}
+\index{DbcParser@{DbcParser}!ParseFile@{ParseFile}}
+\index{ParseFile@{ParseFile}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{ParseFile()}{ParseFile()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} Dbc\+Parser\+::\+Parse\+File (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{file\+Path }\end{DoxyParamCaption}) const}
+
+
+
+Parse DBC file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em file\+Path} & Path to input file. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Parsed database.
+\end{DoxyReturn}
+
+\begin{DoxyExceptions}{Exceptions}
+{\em std\+::runtime\+\_\+error} & on file or parse errors. \\
+\hline
+\end{DoxyExceptions}
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{40}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00079}{Is\+Comment\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00071}{Is\+Frame\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00075}{Is\+Signal\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Parse\+Comment\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Parse\+Frame\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Parse\+Signal\+Line()}}, \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00083}{Trim()}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+\mbox{\Hypertarget{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}\label{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}}
+\index{DbcParser@{DbcParser}!ParseFrameLine@{ParseFrameLine}}
+\index{ParseFrameLine@{ParseFrameLine}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{ParseFrameLine()}{ParseFrameLine()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} Dbc\+Parser\+::\+Parse\+Frame\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{142}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{frame__info_8h_source_l00026}{Frame\+Info\+::can\+Id}}, \mbox{\hyperlink{frame__info_8h_source_l00030}{Frame\+Info\+::dlc}}, \mbox{\hyperlink{frame__info_8h_source_l00029}{Frame\+Info\+::has\+Pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00027}{Frame\+Info\+::is\+Extended}}, \mbox{\hyperlink{frame__info_8h_source_l00025}{Frame\+Info\+::name}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00101}{Normalize\+Can\+Id()}}, \mbox{\hyperlink{frame__info_8h_source_l00028}{Frame\+Info\+::pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00031}{Frame\+Info\+::transmitter}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00118}{Try\+Extract\+Pgn()}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}\label{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}}
+\index{DbcParser@{DbcParser}!ParseSignalLine@{ParseSignalLine}}
+\index{ParseSignalLine@{ParseSignalLine}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{ParseSignalLine()}{ParseSignalLine()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} Dbc\+Parser\+::\+Parse\+Signal\+Line (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{line }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{181}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{signal__info_8h_source_l00028}{Signal\+Info\+::factor}}, \mbox{\hyperlink{signal__info_8h_source_l00026}{Signal\+Info\+::is\+Little\+Endian}}, \mbox{\hyperlink{signal__info_8h_source_l00027}{Signal\+Info\+::is\+Signed}}, \mbox{\hyperlink{signal__info_8h_source_l00025}{Signal\+Info\+::length}}, \mbox{\hyperlink{signal__info_8h_source_l00031}{Signal\+Info\+::maximum}}, \mbox{\hyperlink{signal__info_8h_source_l00030}{Signal\+Info\+::minimum}}, \mbox{\hyperlink{signal__info_8h_source_l00023}{Signal\+Info\+::name}}, \mbox{\hyperlink{signal__info_8h_source_l00029}{Signal\+Info\+::offset}}, \mbox{\hyperlink{signal__info_8h_source_l00033}{Signal\+Info\+::receivers}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00087}{Split\+Receivers()}}, \mbox{\hyperlink{signal__info_8h_source_l00024}{Signal\+Info\+::start\+Bit}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text()}}, and \mbox{\hyperlink{signal__info_8h_source_l00032}{Signal\+Info\+::unit}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}\label{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}}
+\index{DbcParser@{DbcParser}!SplitReceivers@{SplitReceivers}}
+\index{SplitReceivers@{SplitReceivers}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{SplitReceivers()}{SplitReceivers()}}
+{\footnotesize\ttfamily std\+::vector$<$ std\+::string $>$ Dbc\+Parser\+::\+Split\+Receivers (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{text }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00087}{87}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text()}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}\label{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}}
+\index{DbcParser@{DbcParser}!Trim@{Trim}}
+\index{Trim@{Trim}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{Trim()}{Trim()}}
+{\footnotesize\ttfamily std\+::string Dbc\+Parser\+::\+Trim (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{text }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00083}{83}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text()}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Parse\+File()}}.
+
+\mbox{\Hypertarget{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}\label{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}}
+\index{DbcParser@{DbcParser}!TryExtractPgn@{TryExtractPgn}}
+\index{TryExtractPgn@{TryExtractPgn}!DbcParser@{DbcParser}}
+\doxysubsubsection{\texorpdfstring{TryExtractPgn()}{TryExtractPgn()}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Dbc\+Parser\+::\+Try\+Extract\+Pgn (\begin{DoxyParamCaption}\item[{std\+::uint32\+\_\+t}]{can\+Id, }\item[{bool}]{is\+Extended, }\item[{bool \&}]{has\+Pgn }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00118}{118}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Parse\+Frame\+Line()}}.
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__parser_8h}{dbc\+\_\+parser.\+h}}\item
+\mbox{\hyperlink{dbc__parser_8cpp}{dbc\+\_\+parser.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classDbcTreeBuilder.tex b/docs/latex/classDbcTreeBuilder.tex
new file mode 100644
index 0000000..3eaff73
--- /dev/null
+++ b/docs/latex/classDbcTreeBuilder.tex
@@ -0,0 +1,62 @@
+\hypertarget{classDbcTreeBuilder}{}\doxysection{Dbc\+Tree\+Builder Class Reference}
+\label{classDbcTreeBuilder}\index{DbcTreeBuilder@{DbcTreeBuilder}}
+
+
+Builds a simple tree from parsed DBC database.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+tree\+\_\+builder.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ \mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}} (const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&database) const
+\begin{DoxyCompactList}\small\item\em Build tree representation of parsed DBC data. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Builds a simple tree from parsed DBC database.
+
+Definition at line \mbox{\hyperlink{dbc__tree__builder_8h_source_l00023}{23}} of file \mbox{\hyperlink{dbc__tree__builder_8h_source}{dbc\+\_\+tree\+\_\+builder.\+h}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}\label{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}}
+\index{DbcTreeBuilder@{DbcTreeBuilder}!Build@{Build}}
+\index{Build@{Build}!DbcTreeBuilder@{DbcTreeBuilder}}
+\doxysubsubsection{\texorpdfstring{Build()}{Build()}}
+{\footnotesize\ttfamily std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ Dbc\+Tree\+Builder\+::\+Build (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}} \&}]{database }\end{DoxyParamCaption}) const}
+
+
+
+Build tree representation of parsed DBC data.
+
+
+\begin{DoxyParams}{Parameters}
+{\em database} & Parsed database. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Root node of the tree.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{dbc__tree__builder_8cpp_source}{dbc\+\_\+tree\+\_\+builder.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__database_8h_source_l00023}{Dbc\+Database\+::frames}}, and \mbox{\hyperlink{frame__info_8h_source_l00033}{Frame\+Info\+::signals}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\+\_\+tree\+\_\+builder.\+h}}\item
+\mbox{\hyperlink{dbc__tree__builder_8cpp}{dbc\+\_\+tree\+\_\+builder.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classTreeNode.tex b/docs/latex/classTreeNode.tex
new file mode 100644
index 0000000..f5172f1
--- /dev/null
+++ b/docs/latex/classTreeNode.tex
@@ -0,0 +1,449 @@
+\hypertarget{classTreeNode}{}\doxysection{Tree\+Node Class Reference}
+\label{classTreeNode}\index{TreeNode@{TreeNode}}
+
+
+Tree node for later use in model/view or other hierarchy consumers.
+
+
+
+
+{\ttfamily \#include $<$tree\+\_\+node.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{Tree\+Node}} ()
+\begin{DoxyCompactList}\small\item\em Create root node. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}{Tree\+Node}} (const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&frame)
+\begin{DoxyCompactList}\small\item\em Create frame node. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}{Tree\+Node}} (const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \&signal)
+\begin{DoxyCompactList}\small\item\em Create signal node. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}{$\sim$\+Tree\+Node}} ()=default
+\item
+\mbox{\hyperlink{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}{Tree\+Node}} (const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&)=delete
+\item
+\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& \mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{operator=}} (const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&)=delete
+\item
+\mbox{\hyperlink{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}{Tree\+Node}} (\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&)=default
+\item
+\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& \mbox{\hyperlink{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}{operator=}} (\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&)=default
+\item
+void \mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{Add\+Child}} (std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ child)
+\begin{DoxyCompactList}\small\item\em Add child node. \end{DoxyCompactList}\item
+std\+::size\+\_\+t \mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{Get\+Child\+Count}} () const
+\begin{DoxyCompactList}\small\item\em Get child count. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ \mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{Get\+Child}} (std\+::size\+\_\+t index) const
+\begin{DoxyCompactList}\small\item\em Get child by index. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ \mbox{\hyperlink{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}{Get\+Child}} (std\+::size\+\_\+t index)
+\begin{DoxyCompactList}\small\item\em Get mutable child by index. \end{DoxyCompactList}\item
+\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} \mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{Get\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get node type. \end{DoxyCompactList}\item
+const std\+::string \& \mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{Get\+Name}} () const
+\begin{DoxyCompactList}\small\item\em Get display name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ \mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{Get\+Frame}} () const
+\begin{DoxyCompactList}\small\item\em Get frame payload if node is frame. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ \mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{Get\+Signal}} () const
+\begin{DoxyCompactList}\small\item\em Get signal payload if node is signal. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Private Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} \mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{m\+\_\+type}}
+\item
+std\+::string \mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{m\+\_\+name}}
+\item
+std\+::vector$<$ std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$ $>$ \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\+\_\+children}}
+\item
+std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $>$ \mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{m\+\_\+frame}}
+\item
+std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $>$ \mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{m\+\_\+signal}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Tree node for later use in model/view or other hierarchy consumers.
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00035}{35}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}\label{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [1/5]}}
+{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Create root node.
+
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00014}{14}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}}.
+
+\mbox{\Hypertarget{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}\label{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [2/5]}}
+{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} \&}]{frame }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [explicit]}}
+
+
+
+Create frame node.
+
+
+\begin{DoxyParams}{Parameters}
+{\em frame} & Frame payload. \\
+\hline
+\end{DoxyParams}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00022}{22}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}}.
+
+\mbox{\Hypertarget{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}\label{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [3/5]}}
+{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} \&}]{signal }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [explicit]}}
+
+
+
+Create signal node.
+
+
+\begin{DoxyParams}{Parameters}
+{\em signal} & Signal payload. \\
+\hline
+\end{DoxyParams}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00030}{30}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}.
+
+\mbox{\Hypertarget{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}\label{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}}
+\index{TreeNode@{TreeNode}!````~TreeNode@{$\sim$TreeNode}}
+\index{````~TreeNode@{$\sim$TreeNode}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{$\sim$TreeNode()}{~TreeNode()}}
+{\footnotesize\ttfamily Tree\+Node\+::$\sim$\+Tree\+Node (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [default]}}
+
+\mbox{\Hypertarget{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}\label{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [4/5]}}
+{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [delete]}}
+
+\mbox{\Hypertarget{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}\label{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\index{TreeNode@{TreeNode}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{TreeNode()}{TreeNode()}\hspace{0.1cm}{\footnotesize\ttfamily [5/5]}}
+{\footnotesize\ttfamily Tree\+Node\+::\+Tree\+Node (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [default]}}
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classTreeNode_a6161f2ebb92184eab4215d121870e788}\label{classTreeNode_a6161f2ebb92184eab4215d121870e788}}
+\index{TreeNode@{TreeNode}!AddChild@{AddChild}}
+\index{AddChild@{AddChild}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{AddChild()}{AddChild()}}
+{\footnotesize\ttfamily void Tree\+Node\+::\+Add\+Child (\begin{DoxyParamCaption}\item[{std\+::unique\+\_\+ptr$<$ \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $>$}]{child }\end{DoxyParamCaption})}
+
+
+
+Add child node.
+
+
+\begin{DoxyParams}{Parameters}
+{\em child} & Child node to add. \\
+\hline
+\end{DoxyParams}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00038}{38}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}.
+
+\mbox{\Hypertarget{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}\label{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}}
+\index{TreeNode@{TreeNode}!GetChild@{GetChild}}
+\index{GetChild@{GetChild}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetChild()}{GetChild()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ Tree\+Node\+::\+Get\+Child (\begin{DoxyParamCaption}\item[{std\+::size\+\_\+t}]{index }\end{DoxyParamCaption})}
+
+
+
+Get mutable child by index.
+
+
+\begin{DoxyParams}{Parameters}
+{\em index} & Child index. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Child pointer or nullptr if index is invalid.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00054}{54}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}.
+
+\mbox{\Hypertarget{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}\label{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}}
+\index{TreeNode@{TreeNode}!GetChild@{GetChild}}
+\index{GetChild@{GetChild}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetChild()}{GetChild()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$ Tree\+Node\+::\+Get\+Child (\begin{DoxyParamCaption}\item[{std\+::size\+\_\+t}]{index }\end{DoxyParamCaption}) const}
+
+
+
+Get child by index.
+
+
+\begin{DoxyParams}{Parameters}
+{\em index} & Child index. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Child pointer or nullptr if index is invalid.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00047}{47}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}\label{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}}
+\index{TreeNode@{TreeNode}!GetChildCount@{GetChildCount}}
+\index{GetChildCount@{GetChildCount}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetChildCount()}{GetChildCount()}}
+{\footnotesize\ttfamily std\+::size\+\_\+t Tree\+Node\+::\+Get\+Child\+Count (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get child count.
+
+\begin{DoxyReturn}{Returns}
+Number of children.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00043}{43}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00115}{m\+\_\+children}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{classTreeNode_afc503b40004764163605d6dbdb4ef811}\label{classTreeNode_afc503b40004764163605d6dbdb4ef811}}
+\index{TreeNode@{TreeNode}!GetFrame@{GetFrame}}
+\index{GetFrame@{GetFrame}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetFrame()}{GetFrame()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $\ast$ Tree\+Node\+::\+Get\+Frame (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get frame payload if node is frame.
+
+\begin{DoxyReturn}{Returns}
+Pointer to frame info or nullptr.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00069}{69}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00116}{m\+\_\+frame}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}\label{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}}
+\index{TreeNode@{TreeNode}!GetName@{GetName}}
+\index{GetName@{GetName}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetName()}{GetName()}}
+{\footnotesize\ttfamily const std\+::string \& Tree\+Node\+::\+Get\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get display name.
+
+\begin{DoxyReturn}{Returns}
+Node name.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00065}{65}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00114}{m\+\_\+name}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}\label{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}}
+\index{TreeNode@{TreeNode}!GetSignal@{GetSignal}}
+\index{GetSignal@{GetSignal}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetSignal()}{GetSignal()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $\ast$ Tree\+Node\+::\+Get\+Signal (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get signal payload if node is signal.
+
+\begin{DoxyReturn}{Returns}
+Pointer to signal info or nullptr.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00073}{73}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00117}{m\+\_\+signal}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}\label{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}}
+\index{TreeNode@{TreeNode}!GetType@{GetType}}
+\index{GetType@{GetType}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{GetType()}{GetType()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} Tree\+Node\+::\+Get\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get node type.
+
+\begin{DoxyReturn}{Returns}
+Node type.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8cpp_source_l00061}{61}} of file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{tree__node_8h_source_l00113}{m\+\_\+type}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}\label{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}}
+\index{TreeNode@{TreeNode}!operator=@{operator=}}
+\index{operator=@{operator=}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& Tree\+Node\+::operator= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [delete]}}
+
+\mbox{\Hypertarget{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}\label{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}}
+\index{TreeNode@{TreeNode}!operator=@{operator=}}
+\index{operator=@{operator=}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}} \& Tree\+Node\+::operator= (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classTreeNode}{Tree\+Node}} \&\&}]{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [default]}}
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classTreeNode_a1bd61f40df6d36e61021063e3816a351}\label{classTreeNode_a1bd61f40df6d36e61021063e3816a351}}
+\index{TreeNode@{TreeNode}!m\_children@{m\_children}}
+\index{m\_children@{m\_children}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{m\_children}{m\_children}}
+{\footnotesize\ttfamily std\+::vector$<$std\+::unique\+\_\+ptr$<$\mbox{\hyperlink{classTreeNode}{Tree\+Node}}$>$ $>$ Tree\+Node\+::m\+\_\+children\hspace{0.3cm}{\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00115}{115}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00038}{Add\+Child()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00047}{Get\+Child()}}, and \mbox{\hyperlink{tree__node_8cpp_source_l00043}{Get\+Child\+Count()}}.
+
+\mbox{\Hypertarget{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}\label{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}}
+\index{TreeNode@{TreeNode}!m\_frame@{m\_frame}}
+\index{m\_frame@{m\_frame}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{m\_frame}{m\_frame}}
+{\footnotesize\ttfamily std\+::unique\+\_\+ptr$<$\mbox{\hyperlink{structFrameInfo}{Frame\+Info}}$>$ Tree\+Node\+::m\+\_\+frame\hspace{0.3cm}{\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00116}{116}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00069}{Get\+Frame()}}.
+
+\mbox{\Hypertarget{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}\label{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}}
+\index{TreeNode@{TreeNode}!m\_name@{m\_name}}
+\index{m\_name@{m\_name}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{m\_name}{m\_name}}
+{\footnotesize\ttfamily std\+::string Tree\+Node\+::m\+\_\+name\hspace{0.3cm}{\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00114}{114}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00065}{Get\+Name()}}.
+
+\mbox{\Hypertarget{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}\label{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}}
+\index{TreeNode@{TreeNode}!m\_signal@{m\_signal}}
+\index{m\_signal@{m\_signal}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{m\_signal}{m\_signal}}
+{\footnotesize\ttfamily std\+::unique\+\_\+ptr$<$\mbox{\hyperlink{structSignalInfo}{Signal\+Info}}$>$ Tree\+Node\+::m\+\_\+signal\hspace{0.3cm}{\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00117}{117}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00073}{Get\+Signal()}}.
+
+\mbox{\Hypertarget{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}\label{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}}
+\index{TreeNode@{TreeNode}!m\_type@{m\_type}}
+\index{m\_type@{m\_type}!TreeNode@{TreeNode}}
+\doxysubsubsection{\texorpdfstring{m\_type}{m\_type}}
+{\footnotesize\ttfamily \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} Tree\+Node\+::m\+\_\+type\hspace{0.3cm}{\ttfamily [private]}}
+
+
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00113}{113}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{tree__node_8cpp_source_l00061}{Get\+Type()}}.
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{tree__node_8h}{tree\+\_\+node.\+h}}\item
+\mbox{\hyperlink{tree__node_8cpp}{tree\+\_\+node.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/latex/dbc__database_8h.tex b/docs/latex/dbc__database_8h.tex
new file mode 100644
index 0000000..3c17b80
--- /dev/null
+++ b/docs/latex/dbc__database_8h.tex
@@ -0,0 +1,23 @@
+\hypertarget{dbc__database_8h}{}\doxysection{dbc\+\_\+database.\+h File Reference}
+\label{dbc__database_8h}\index{dbc\_database.h@{dbc\_database.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include \char`\"{}frame\+\_\+info.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structDbcDatabase}{Dbc\+Database}}
+\begin{DoxyCompactList}\small\item\em Parsed DBC content stored in a simple internal form. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__database_8h_source}{dbc\+\_\+database.\+h}}.
+
diff --git a/docs/latex/dbc__database_8h_source.tex b/docs/latex/dbc__database_8h_source.tex
new file mode 100644
index 0000000..69ac7ac
--- /dev/null
+++ b/docs/latex/dbc__database_8h_source.tex
@@ -0,0 +1,31 @@
+\hypertarget{dbc__database_8h_source}{}\doxysection{dbc\+\_\+database.\+h}
+\mbox{\hyperlink{dbc__database_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_database.h}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_DATABASE\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_DATABASE\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00016}00016 }
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00017}00017 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{frame__info_8h}{frame\_info.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00018}00018 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00019}00019 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00020}00020 \textcolor{comment}{ * @brief Parsed DBC content stored in a simple internal form.}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00021}00021 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00022}\mbox{\hyperlink{structDbcDatabase}{00022}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00023}\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{00023}} std::vector \mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}; \textcolor{comment}{/**< All frames found in the DBC file. */}}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00024}00024 \};}
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00025}00025 }
+\DoxyCodeLine{\Hypertarget{dbc__database_8h_source_l00026}00026 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_DATABASE\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__decode__builder_8cpp.tex b/docs/latex/dbc__decode__builder_8cpp.tex
new file mode 100644
index 0000000..126cd28
--- /dev/null
+++ b/docs/latex/dbc__decode__builder_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{dbc__decode__builder_8cpp}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+cpp File Reference}
+\label{dbc__decode__builder_8cpp}\index{dbc\_decode\_builder.cpp@{dbc\_decode\_builder.cpp}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include \char`\"{}dbc\+\_\+decode\+\_\+builder.\+h\char`\"{}}\newline
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__decode__builder_8cpp_source}{dbc\+\_\+decode\+\_\+builder.\+cpp}}.
+
diff --git a/docs/latex/dbc__decode__builder_8cpp_source.tex b/docs/latex/dbc__decode__builder_8cpp_source.tex
new file mode 100644
index 0000000..45aa455
--- /dev/null
+++ b/docs/latex/dbc__decode__builder_8cpp_source.tex
@@ -0,0 +1,61 @@
+\hypertarget{dbc__decode__builder_8cpp_source}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+cpp}
+\mbox{\hyperlink{dbc__decode__builder_8cpp}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decode\_builder.cpp}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\_decode\_builder.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00013}00013 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00014}\mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{00014}} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{DbcDecodeBuilder::Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&source)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00015}00015 \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} result;}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00016}00016 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00017}00017 \textcolor{keywordflow}{for} (std::size\_t frameIndex = 0U; frameIndex < source.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.size(); ++frameIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00018}00018 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&sourceFrame = source.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[frameIndex];}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00019}00019 \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} targetFrame;}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00020}00020 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00021}00021 targetFrame.\mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00022}00022 targetFrame.\mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00023}00023 targetFrame.\mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00024}00024 targetFrame.\mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00025}00025 targetFrame.\mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00026}00026 targetFrame.\mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{hasPgn}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00027}00027 targetFrame.\mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00028}00028 targetFrame.\mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}} = sourceFrame.\mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00029}00029 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00030}00030 \textcolor{keywordflow}{for} (std::size\_t signalIndex = 0U; signalIndex < sourceFrame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.size(); ++signalIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00031}00031 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&sourceSignal = sourceFrame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[signalIndex];}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00032}00032 \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} targetSignal;}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00033}00033 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00034}00034 targetSignal.\mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00035}00035 targetSignal.\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00036}00036 targetSignal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00037}00037 targetSignal.\mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}} ? \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{ByteOrder::Intel}} : \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{ByteOrder::Motorola}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00038}00038 targetSignal.\mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}} ? \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{ValueType::Signed}} : \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{ValueType::Unsigned}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00039}00039 targetSignal.\mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00040}00040 targetSignal.\mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00041}00041 targetSignal.\mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00042}00042 targetSignal.\mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00043}00043 targetSignal.\mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00044}00044 targetSignal.\mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00045}00045 targetSignal.\mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}} = sourceSignal.\mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00046}00046 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00047}00047 targetFrame.\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}.push\_back (targetSignal);}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00048}00048 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00049}00049 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00050}00050 result.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.push\_back (targetFrame);}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00051}00051 result.\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}}[\mbox{\hyperlink{structFrameKey}{FrameKey}} (targetFrame.\mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}}, targetFrame.\mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}})] =}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00052}00052 result.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.size() -\/ 1U;}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00053}00053 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00054}00054 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00055}00055 \textcolor{keywordflow}{return} result;}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8cpp_source_l00056}00056 \}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__decode__builder_8h.tex b/docs/latex/dbc__decode__builder_8h.tex
new file mode 100644
index 0000000..6eb60bd
--- /dev/null
+++ b/docs/latex/dbc__decode__builder_8h.tex
@@ -0,0 +1,23 @@
+\hypertarget{dbc__decode__builder_8h}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+h File Reference}
+\label{dbc__decode__builder_8h}\index{dbc\_decode\_builder.h@{dbc\_decode\_builder.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include \char`\"{}dbc\+\_\+database.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}decode\+\_\+database.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classDbcDecodeBuilder}{Dbc\+Decode\+Builder}}
+\begin{DoxyCompactList}\small\item\em Converts parsed DBC data into runtime decode database. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__decode__builder_8h_source}{dbc\+\_\+decode\+\_\+builder.\+h}}.
+
diff --git a/docs/latex/dbc__decode__builder_8h_source.tex b/docs/latex/dbc__decode__builder_8h_source.tex
new file mode 100644
index 0000000..7675003
--- /dev/null
+++ b/docs/latex/dbc__decode__builder_8h_source.tex
@@ -0,0 +1,36 @@
+\hypertarget{dbc__decode__builder_8h_source}{}\doxysection{dbc\+\_\+decode\+\_\+builder.\+h}
+\mbox{\hyperlink{dbc__decode__builder_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decode\_builder.h}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_DECODE\_BUILDER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_DECODE\_BUILDER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00015}00015 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__database_8h}{dbc\_database.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00016}00016 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{decode__database_8h}{decode\_database.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00017}00017 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00018}00018 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00019}00019 \textcolor{comment}{ * @brief Converts parsed DBC data into runtime decode database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00020}00020 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00021}\mbox{\hyperlink{classDbcDecodeBuilder}{00021}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcDecodeBuilder}{DbcDecodeBuilder}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00022}00022 \textcolor{keyword}{public}:\textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00023}00023 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00024}00024 \textcolor{comment}{ * @brief Build runtime decode database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00025}00025 \textcolor{comment}{ * @param source Parsed DBC database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00026}00026 \textcolor{comment}{ * @return Runtime-\/ready decode database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00027}00027 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00028}00028 \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&source) \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00029}00029 \};}
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00030}00030 }
+\DoxyCodeLine{\Hypertarget{dbc__decode__builder_8h_source_l00031}00031 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_DECODE\_BUILDER\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__decoder_8cpp.tex b/docs/latex/dbc__decoder_8cpp.tex
new file mode 100644
index 0000000..fb7d09a
--- /dev/null
+++ b/docs/latex/dbc__decoder_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{dbc__decoder_8cpp}{}\doxysection{dbc\+\_\+decoder.\+cpp File Reference}
+\label{dbc__decoder_8cpp}\index{dbc\_decoder.cpp@{dbc\_decoder.cpp}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include \char`\"{}dbc\+\_\+decoder.\+h\char`\"{}}\newline
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__decoder_8cpp_source}{dbc\+\_\+decoder.\+cpp}}.
+
diff --git a/docs/latex/dbc__decoder_8cpp_source.tex b/docs/latex/dbc__decoder_8cpp_source.tex
new file mode 100644
index 0000000..1d1cd95
--- /dev/null
+++ b/docs/latex/dbc__decoder_8cpp_source.tex
@@ -0,0 +1,162 @@
+\hypertarget{dbc__decoder_8cpp_source}{}\doxysection{dbc\+\_\+decoder.\+cpp}
+\mbox{\hyperlink{dbc__decoder_8cpp}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decoder.cpp}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decoder_8h}{dbc\_decoder.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00013}00013 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00014}\mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{00014}} \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *\mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{DbcDecoder::FindFrame}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00015}00015 std::uint32\_t canId,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00016}00016 \textcolor{keywordtype}{bool} isExtended)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00017}00017 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameKey}{FrameKey}} key (canId, isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00018}00018 \textcolor{keyword}{const} std::unordered\_map::const\_iterator it =}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00019}00019 database.\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}}.find (key);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00020}00020 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00021}00021 \textcolor{keywordflow}{if} (it == database.\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}}.end())}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00022}00022 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00023}00023 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00024}00024 \textcolor{keyword}{const} std::size\_t index = it-\/>second;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00025}00025 \textcolor{keywordflow}{if} (index >= database.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.size())}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00026}00026 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00027}00027 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00028}00028 \textcolor{keywordflow}{return} \&database.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}[index];}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00029}00029 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00030}00030 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00031}\mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{00031}} \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{DbcDecoder::Decode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00032}00032 \textcolor{keyword}{const} \mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} \&frame)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00033}00033 \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} result;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00034}00034 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *definition = \mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{FindFrame}} (database, frame.\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}}, frame.\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}});}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00035}00035 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00036}00036 \textcolor{keywordflow}{if} (definition == \textcolor{keyword}{nullptr})}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00037}00037 \textcolor{keywordflow}{return} result;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00038}00038 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00039}00039 result.\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} = definition;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00040}00040 result.\mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} = \textcolor{keyword}{true};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00041}00041 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00042}00042 \textcolor{keywordflow}{for} (std::size\_t signalIndex = 0U; signalIndex < definition-\/>\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}.size(); ++signalIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00043}00043 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \&signal = definition-\/>\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}[signalIndex];}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00044}00044 \mbox{\hyperlink{structDecodedSignalValue}{DecodedSignalValue}} decoded;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00045}00045 std::uint64\_t unsignedValue = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00046}00046 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00047}00047 decoded.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} = \&signal;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00048}00048 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00049}00049 \textcolor{keywordflow}{if} (!\mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{ExtractUnsigned}} (frame.\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}, signal, unsignedValue)) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00050}00050 decoded.\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} = \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00051}00051 result.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}.push\_back (decoded);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00052}00052 \textcolor{keywordflow}{continue};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00053}00053 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00054}00054 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00055}00055 \textcolor{keywordflow}{if} (signal.\mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}} == \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{ValueType::Signed}})}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00056}00056 decoded.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}} = \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{SignExtend}} (unsignedValue, signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}});}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00057}00057 \textcolor{keywordflow}{else}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00058}00058 decoded.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}} = \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (unsignedValue);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00059}00059 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00060}00060 decoded.\mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}} =}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00061}00061 (\textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{double}\textcolor{keyword}{>} (decoded.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}}) * signal.\mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}}) + signal.\mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00062}00062 decoded.\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} = \textcolor{keyword}{true};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00063}00063 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00064}00064 result.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}.push\_back (decoded);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00065}00065 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00066}00066 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00067}00067 \textcolor{keywordflow}{return} result;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00068}00068 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00069}00069 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00070}\mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{00070}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{DbcDecoder::ExtractUnsigned}} (\textcolor{keyword}{const} std::vector \&data,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00071}00071 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \&signal,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00072}00072 std::uint64\_t \&value) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00073}00073 \textcolor{keywordflow}{if} ((signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} == 0U) || (signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} > 64U))}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00074}00074 \textcolor{keywordflow}{return} \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00075}00075 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00076}00076 \textcolor{keywordflow}{if} (signal.\mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}} == \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{ByteOrder::Intel}})}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00077}00077 \textcolor{keywordflow}{return} \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{ExtractIntel}} (data, signal.\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}}, signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}, value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00078}00078 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00079}00079 \textcolor{keywordflow}{return} \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{ExtractMotorola}} (data, signal.\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}}, signal.\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}, value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00080}00080 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00081}00081 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00082}\mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{00082}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{DbcDecoder::ExtractIntel}} (\textcolor{keyword}{const} std::vector \&data,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00083}00083 std::uint32\_t startBit,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00084}00084 std::uint32\_t length,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00085}00085 std::uint64\_t \&value) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00086}00086 value = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00087}00087 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00088}00088 \textcolor{keywordflow}{for} (std::uint32\_t bitIndex = 0U; bitIndex < length; ++bitIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00089}00089 \textcolor{keyword}{const} std::uint32\_t absoluteBit = startBit + bitIndex;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00090}00090 \textcolor{keyword}{const} std::uint32\_t byteIndex = absoluteBit / 8U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00091}00091 \textcolor{keyword}{const} std::uint32\_t bitInByte = absoluteBit \% 8U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00092}00092 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00093}00093 \textcolor{keywordflow}{if} (byteIndex >= data.size())}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00094}00094 \textcolor{keywordflow}{return} \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00095}00095 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00096}00096 \textcolor{keyword}{const} std::uint64\_t bitValue =}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00097}00097 (\textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} ((data[byteIndex] >> bitInByte) \& 0x01U) << bitIndex);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00098}00098 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00099}00099 value |= bitValue;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00100}00100 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00101}00101 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00102}00102 \textcolor{keywordflow}{return} \textcolor{keyword}{true};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00103}00103 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00104}00104 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00105}\mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{00105}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{DbcDecoder::ExtractMotorola}} (\textcolor{keyword}{const} std::vector \&data,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00106}00106 std::uint32\_t startBit,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00107}00107 std::uint32\_t length,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00108}00108 std::uint64\_t \&value) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00109}00109 \textcolor{comment}{/*}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00110}00110 \textcolor{comment}{ * DBC Motorola bit numbering:}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00111}00111 \textcolor{comment}{ * -\/ startBit points to the most significant bit of the signal}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00112}00112 \textcolor{comment}{ * -\/ inside a byte, bit numbering goes 7..0}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00113}00113 \textcolor{comment}{ * -\/ crossing byte boundary moves to the next byte, bit 7}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00114}00114 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00115}00115 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00116}00116 value = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00117}00117 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00118}00118 std::int32\_t currentBit = \textcolor{keyword}{static\_cast<}std::int32\_t\textcolor{keyword}{>} (startBit);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00119}00119 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00120}00120 \textcolor{keywordflow}{for} (std::uint32\_t bitIndex = 0U; bitIndex < length; ++bitIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00121}00121 \textcolor{keywordflow}{if} (currentBit < 0)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00122}00122 \textcolor{keywordflow}{return} \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00123}00123 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00124}00124 \textcolor{keyword}{const} std::uint32\_t absoluteBit = \textcolor{keyword}{static\_cast<}std::uint32\_t\textcolor{keyword}{>} (currentBit);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00125}00125 \textcolor{keyword}{const} std::uint32\_t byteIndex = absoluteBit / 8U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00126}00126 \textcolor{keyword}{const} std::uint32\_t bitFromMsb = absoluteBit \% 8U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00127}00127 \textcolor{keyword}{const} std::uint32\_t bitInByte = 7U -\/ bitFromMsb;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00128}00128 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00129}00129 \textcolor{keywordflow}{if} (byteIndex >= data.size())}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00130}00130 \textcolor{keywordflow}{return} \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00131}00131 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00132}00132 value <<= 1U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00133}00133 value |= \textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} ((data[byteIndex] >> bitInByte) \& 0x01U);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00134}00134 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00135}00135 \textcolor{keywordflow}{if} ((absoluteBit \% 8U) == 7U)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00136}00136 currentBit = \textcolor{keyword}{static\_cast<}std::int32\_t\textcolor{keyword}{>} ((byteIndex + 1U) * 8U);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00137}00137 \textcolor{keywordflow}{else}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00138}00138 -\/-\/currentBit;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00139}00139 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00140}00140 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00141}00141 \textcolor{keywordflow}{return} \textcolor{keyword}{true};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00142}00142 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00143}00143 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00144}\mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{00144}} std::int64\_t \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{DbcDecoder::SignExtend}} (std::uint64\_t value, std::uint32\_t bitLength) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00145}00145 \textcolor{keywordflow}{if} ((bitLength == 0U) || (bitLength >= 64U))}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00146}00146 \textcolor{keywordflow}{return} \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00147}00147 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00148}00148 \textcolor{keyword}{const} std::uint64\_t signMask = (\textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} (1U) << (bitLength -\/ 1U));}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00149}00149 \textcolor{keyword}{const} std::uint64\_t valueMask = (\textcolor{keyword}{static\_cast<}std::uint64\_t\textcolor{keyword}{>} (1U) << bitLength) -\/ 1U;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00150}00150 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00151}00151 value \&= valueMask;}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00152}00152 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00153}00153 \textcolor{keywordflow}{if} ((value \& signMask) == 0U)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00154}00154 \textcolor{keywordflow}{return} \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00155}00155 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00156}00156 \textcolor{keywordflow}{return} \textcolor{keyword}{static\_cast<}std::int64\_t\textcolor{keyword}{>} (value | (\string~valueMask));}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8cpp_source_l00157}00157 \}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__decoder_8h.tex b/docs/latex/dbc__decoder_8h.tex
new file mode 100644
index 0000000..58c7cec
--- /dev/null
+++ b/docs/latex/dbc__decoder_8h.tex
@@ -0,0 +1,30 @@
+\hypertarget{dbc__decoder_8h}{}\doxysection{dbc\+\_\+decoder.\+h File Reference}
+\label{dbc__decoder_8h}\index{dbc\_decoder.h@{dbc\_decoder.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$cstdint$>$}\newline
+{\ttfamily \#include \char`\"{}decode\+\_\+database.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structRawCanFrame}{Raw\+Can\+Frame}}
+\begin{DoxyCompactList}\small\item\em Raw CAN frame used for runtime or trace decoding. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}}
+\begin{DoxyCompactList}\small\item\em One decoded signal value. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}}
+\begin{DoxyCompactList}\small\item\em Fully decoded frame. \end{DoxyCompactList}\item
+class \mbox{\hyperlink{classDbcDecoder}{Dbc\+Decoder}}
+\begin{DoxyCompactList}\small\item\em Runtime CAN decoder using prebuilt decode database. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
diff --git a/docs/latex/dbc__decoder_8h_source.tex b/docs/latex/dbc__decoder_8h_source.tex
new file mode 100644
index 0000000..09e45b7
--- /dev/null
+++ b/docs/latex/dbc__decoder_8h_source.tex
@@ -0,0 +1,115 @@
+\hypertarget{dbc__decoder_8h_source}{}\doxysection{dbc\+\_\+decoder.\+h}
+\mbox{\hyperlink{dbc__decoder_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_decoder.h}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_DECODER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_DECODER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00017}00017 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00018}00018 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{decode__database_8h}{decode\_database.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00019}00019 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00020}00020 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00021}00021 \textcolor{comment}{ * @brief Raw CAN frame used for runtime or trace decoding.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00022}00022 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00023}\mbox{\hyperlink{structRawCanFrame}{00023}} \textcolor{keyword}{struct }\mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00024}\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{00024}} std::uint32\_t \mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}}; \textcolor{comment}{/**< Normalized CAN ID. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00025}\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{00025}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}}; \textcolor{comment}{/**< true for extended frame. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00026}\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{00026}} std::vector \mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}; \textcolor{comment}{/**< Payload bytes. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00027}00027 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00028}\mbox{\hyperlink{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}{00028}} \mbox{\hyperlink{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}{RawCanFrame}}()}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00029}00029 : \mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}} (0U)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00030}00030 , \mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}} (false)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00031}00031 , \mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}() \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00032}00032 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00033}00033 \};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00034}00034 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00035}00035 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00036}00036 \textcolor{comment}{ * @brief One decoded signal value.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00037}00037 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00038}\mbox{\hyperlink{structDecodedSignalValue}{00038}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodedSignalValue}{DecodedSignalValue}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00039}\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{00039}} \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} *\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}; \textcolor{comment}{/**< Signal definition. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00040}\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{00040}} std::int64\_t \mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}}; \textcolor{comment}{/**< Extracted raw integer value. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00041}\mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{00041}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}}; \textcolor{comment}{/**< Converted physical value. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00042}\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{00042}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}}; \textcolor{comment}{/**< true if decoding succeeded. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00043}00043 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00044}\mbox{\hyperlink{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}{00044}} \mbox{\hyperlink{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}{DecodedSignalValue}}()}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00045}00045 : \mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} (nullptr)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00046}00046 , \mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}} (0)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00047}00047 , \mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}} (0.0)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00048}00048 , \mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}} (false) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00049}00049 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00050}00050 \};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00051}00051 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00052}00052 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00053}00053 \textcolor{comment}{ * @brief Fully decoded frame.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00054}00054 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00055}\mbox{\hyperlink{structDecodedFrameValue}{00055}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00056}\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{00056}} \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}}; \textcolor{comment}{/**< Frame definition. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00057}\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{00057}} std::vector \mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}; \textcolor{comment}{/**< Decoded signal values. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00058}\mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{00058}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}}; \textcolor{comment}{/**< true if frame was matched. */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00059}00059 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00060}\mbox{\hyperlink{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}{00060}} \mbox{\hyperlink{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}{DecodedFrameValue}}()}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00061}00061 : \mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} (nullptr)}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00062}00062 , \mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}()}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00063}00063 , \mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} (false) \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00064}00064 \}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00065}00065 \};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00066}00066 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00067}00067 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00068}00068 \textcolor{comment}{ * @brief Runtime CAN decoder using prebuilt decode database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00069}00069 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00070}\mbox{\hyperlink{classDbcDecoder}{00070}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcDecoder}{DbcDecoder}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00071}00071 \textcolor{keyword}{public}:\textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00072}00072 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00073}00073 \textcolor{comment}{ * @brief Find frame definition by CAN ID.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00074}00074 \textcolor{comment}{ * @param database Runtime decode database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00075}00075 \textcolor{comment}{ * @param canId Normalized CAN ID.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00076}00076 \textcolor{comment}{ * @param isExtended true for extended frame.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00077}00077 \textcolor{comment}{ * @return Pointer to frame definition or nullptr.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00078}00078 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00079}00079 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} *\mbox{\hyperlink{classDbcDecoder_ab2cfb2fb711c95d3a29365546b89f3da}{FindFrame}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00080}00080 std::uint32\_t canId,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00081}00081 \textcolor{keywordtype}{bool} isExtended) \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00082}00082 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00083}00083 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00084}00084 \textcolor{comment}{ * @brief Decode one raw CAN frame.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00085}00085 \textcolor{comment}{ * @param database Runtime decode database.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00086}00086 \textcolor{comment}{ * @param frame Raw CAN frame.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00087}00087 \textcolor{comment}{ * @return Decoded frame value.}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00088}00088 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00089}00089 \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \&database,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00090}00090 \textcolor{keyword}{const} \mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} \&frame) \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00091}00091 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00092}00092 \textcolor{keyword}{private}:}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00093}00093 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_a2a8a99b1107543be6fd1b3f891130bf5}{ExtractUnsigned}} (\textcolor{keyword}{const} std::vector \&data,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00094}00094 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \&signal,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00095}00095 std::uint64\_t \&value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00096}00096 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00097}00097 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aba130165c1a73bb4cd3a0454f415d872}{ExtractIntel}} (\textcolor{keyword}{const} std::vector \&data,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00098}00098 std::uint32\_t startBit,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00099}00099 std::uint32\_t length,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00100}00100 std::uint64\_t \&value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00101}00101 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00102}00102 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcDecoder_aede690734148c3d538105d5a2f7ee0a9}{ExtractMotorola}} (\textcolor{keyword}{const} std::vector \&data,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00103}00103 std::uint32\_t startBit,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00104}00104 std::uint32\_t length,}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00105}00105 std::uint64\_t \&value);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00106}00106 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00107}00107 \textcolor{keyword}{static} std::int64\_t \mbox{\hyperlink{classDbcDecoder_a41e89e343338088d27e46773fa52df42}{SignExtend}} (std::uint64\_t value, std::uint32\_t bitLength);}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00108}00108 \};}
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00109}00109 }
+\DoxyCodeLine{\Hypertarget{dbc__decoder_8h_source_l00110}00110 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_DECODER\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__parser_8cpp.tex b/docs/latex/dbc__parser_8cpp.tex
new file mode 100644
index 0000000..6b0fbe1
--- /dev/null
+++ b/docs/latex/dbc__parser_8cpp.tex
@@ -0,0 +1,31 @@
+\hypertarget{dbc__parser_8cpp}{}\doxysection{dbc\+\_\+parser.\+cpp File Reference}
+\label{dbc__parser_8cpp}\index{dbc\_parser.cpp@{dbc\_parser.cpp}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include \char`\"{}dbc\+\_\+parser.\+h\char`\"{}}\newline
+{\ttfamily \#include $<$fstream$>$}\newline
+{\ttfamily \#include $<$sstream$>$}\newline
+{\ttfamily \#include $<$stdexcept$>$}\newline
+{\ttfamily \#include $<$cctype$>$}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+std\+::string \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text}} (const std\+::string \&text)
+\begin{DoxyCompactList}\small\item\em Remove leading and trailing spaces. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
diff --git a/docs/latex/dbc__parser_8cpp_source.tex b/docs/latex/dbc__parser_8cpp_source.tex
new file mode 100644
index 0000000..7bbd6b7
--- /dev/null
+++ b/docs/latex/dbc__parser_8cpp_source.tex
@@ -0,0 +1,361 @@
+\hypertarget{dbc__parser_8cpp_source}{}\doxysection{dbc\+\_\+parser.\+cpp}
+\mbox{\hyperlink{dbc__parser_8cpp}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_parser.cpp}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__parser_8h}{dbc\_parser.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00013}00013 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00014}00014 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00017}00017 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00018}00018 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00019}\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{00019}} \textcolor{keyword}{namespace }\{\textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00020}00020 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00021}00021 \textcolor{comment}{ * @brief Remove leading and trailing spaces.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00022}00022 \textcolor{comment}{ * @param text Input text.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00023}00023 \textcolor{comment}{ * @return Trimmed text.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00024}00024 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00025}\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{00025}} std::string \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (\textcolor{keyword}{const} std::string \&text) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00026}00026 std::string::size\_type begin = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00027}00027 \textcolor{keywordflow}{while} ((begin < text.size()) \&\&}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00028}00028 std::isspace (\textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char}\textcolor{keyword}{>} (text[begin])))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00029}00029 ++begin;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00030}00030 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00031}00031 std::string::size\_type end = text.size();}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00032}00032 \textcolor{keywordflow}{while} ((end > begin) \&\&}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00033}00033 std::isspace (\textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char}\textcolor{keyword}{>} (text[end -\/ 1U])))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00034}00034 -\/-\/end;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00035}00035 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00036}00036 \textcolor{keywordflow}{return} text.substr (begin, end -\/ begin);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00037}00037 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00038}00038 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00039}00039 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00040}\mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{00040}} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{DbcParser::ParseFile}} (\textcolor{keyword}{const} std::string \&filePath)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00041}00041 std::ifstream input (filePath.c\_str());}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00042}00042 \textcolor{keywordflow}{if} (!input.is\_open())}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00043}00043 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Failed to open DBC file: "{}} + filePath);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00044}00044 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00045}00045 \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} database;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00046}00046 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *currentFrame = \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00047}00047 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00048}00048 std::string line;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00049}00049 \textcolor{keywordflow}{while} (std::getline (input, line)) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00050}00050 line = \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{Trim}} (line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00051}00051 \textcolor{keywordflow}{if} (line.empty())}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00052}00052 \textcolor{keywordflow}{continue};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00053}00053 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00054}00054 \textcolor{keywordflow}{if} (\mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{IsFrameLine}} (line)) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00055}00055 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} frame = \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{ParseFrameLine}} (line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00056}00056 database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.push\_back (frame);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00057}00057 currentFrame = \&database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.back();}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00058}00058 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (\mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{IsSignalLine}} (line)) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00059}00059 \textcolor{keywordflow}{if} (currentFrame == \textcolor{keyword}{nullptr})}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00060}00060 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Signal found before any frame definition."{}});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00061}00061 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00062}00062 \mbox{\hyperlink{structSignalInfo}{SignalInfo}} signal = \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{ParseSignalLine}} (line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00063}00063 currentFrame-\/>\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.push\_back (signal);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00064}00064 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (\mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{IsCommentLine}} (line))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00065}00065 \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{ParseCommentLine}} (line, database);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00066}00066 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00067}00067 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00068}00068 \textcolor{keywordflow}{return} database;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00069}00069 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00070}00070 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00071}\mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{00071}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{DbcParser::IsFrameLine}} (\textcolor{keyword}{const} std::string \&line) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00072}00072 \textcolor{keywordflow}{return} (line.size() >= 4U) \&\& (line.compare (0U, 4U, \textcolor{stringliteral}{"{}BO\_ "{}}) == 0);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00073}00073 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00074}00074 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00075}\mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{00075}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{DbcParser::IsSignalLine}} (\textcolor{keyword}{const} std::string \&line) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00076}00076 \textcolor{keywordflow}{return} (line.size() >= 4U) \&\& (line.compare (0U, 4U, \textcolor{stringliteral}{"{}SG\_ "{}}) == 0);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00077}00077 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00078}00078 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00079}\mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{00079}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{DbcParser::IsCommentLine}} (\textcolor{keyword}{const} std::string \&line) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00080}00080 \textcolor{keywordflow}{return} (line.size() >= 4U) \&\& (line.compare (0U, 4U, \textcolor{stringliteral}{"{}CM\_ "{}}) == 0);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00081}00081 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00082}00082 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00083}\mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{00083}} std::string \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{DbcParser::Trim}} (\textcolor{keyword}{const} std::string \&text) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00084}00084 \textcolor{keywordflow}{return} \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (text);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00085}00085 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00086}00086 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00087}\mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{00087}} std::vector \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{DbcParser::SplitReceivers}} (\textcolor{keyword}{const} std::string \&text) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00088}00088 std::vector receivers;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00089}00089 std::string token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00090}00090 std::istringstream stream (text);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00091}00091 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00092}00092 \textcolor{keywordflow}{while} (std::getline (stream, token, \textcolor{charliteral}{','})) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00093}00093 token = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (token);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00094}00094 \textcolor{keywordflow}{if} (!token.empty())}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00095}00095 receivers.push\_back (token);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00096}00096 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00097}00097 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00098}00098 \textcolor{keywordflow}{return} receivers;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00099}00099 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00100}00100 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00101}\mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{00101}} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{DbcParser::NormalizeCanId}} (std::uint32\_t rawCanId,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00102}00102 std::uint32\_t \&normalizedCanId,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00103}00103 \textcolor{keywordtype}{bool} \&isExtended) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00104}00104 \textcolor{comment}{/*}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00105}00105 \textcolor{comment}{ * DBC commonly stores extended identifiers with bit 31 set.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00106}00106 \textcolor{comment}{ * Example:}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00107}00107 \textcolor{comment}{ * raw id = 0x80000000 | actual\_29\_bit\_id}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00108}00108 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00109}00109 \textcolor{keywordflow}{if} ((rawCanId \& 0x80000000U) != 0U) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00110}00110 isExtended = \textcolor{keyword}{true};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00111}00111 normalizedCanId = (rawCanId \& 0x1FFFFFFFU);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00112}00112 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00113}00113 isExtended = (rawCanId > 0x7FFU);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00114}00114 normalizedCanId = rawCanId;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00115}00115 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00116}00116 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00117}00117 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00118}\mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{00118}} std::uint32\_t \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{DbcParser::TryExtractPgn}} (std::uint32\_t canId, \textcolor{keywordtype}{bool} isExtended, \textcolor{keywordtype}{bool} \&hasPgn) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00119}00119 hasPgn = \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00120}00120 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00121}00121 \textcolor{keywordflow}{if} (!isExtended)}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00122}00122 \textcolor{keywordflow}{return} 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00123}00123 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00124}00124 \textcolor{keywordflow}{if} ((canId \& 0x1FFFFFFFU) != canId)}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00125}00125 \textcolor{keywordflow}{return} 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00126}00126 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00127}00127 \textcolor{keyword}{const} std::uint32\_t pf = (canId >> 16U) \& 0xFFU;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00128}00128 \textcolor{keyword}{const} std::uint32\_t ps = (canId >> 8U) \& 0xFFU;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00129}00129 \textcolor{keyword}{const} std::uint32\_t dp = (canId >> 24U) \& 0x01U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00130}00130 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00131}00131 std::uint32\_t pgn = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00132}00132 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00133}00133 \textcolor{keywordflow}{if} (pf < 240U)}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00134}00134 pgn = (dp << 16U) | (pf << 8U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00135}00135 \textcolor{keywordflow}{else}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00136}00136 pgn = (dp << 16U) | (pf << 8U) | ps;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00137}00137 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00138}00138 hasPgn = \textcolor{keyword}{true};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00139}00139 \textcolor{keywordflow}{return} pgn;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00140}00140 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00141}00141 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00142}\mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{00142}} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{DbcParser::ParseFrameLine}} (\textcolor{keyword}{const} std::string \&line) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00143}00143 \textcolor{comment}{/*}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00144}00144 \textcolor{comment}{ * Example:}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00145}00145 \textcolor{comment}{ * BO\_ 256 EngineData: 8 EEC1}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00146}00146 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00147}00147 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00148}00148 std::istringstream stream (line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00149}00149 std::string token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00150}00150 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} frame;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00151}00151 std::uint32\_t rawCanId = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00152}00152 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00153}00153 stream >> token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00154}00154 \textcolor{keywordflow}{if} (token != \textcolor{stringliteral}{"{}BO\_"{}})}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00155}00155 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Invalid frame line: "{}} + line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00156}00156 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00157}00157 stream >> rawCanId;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00158}00158 \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (rawCanId, frame.\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}}, frame.\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00159}00159 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00160}00160 stream >> token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00161}00161 \textcolor{keywordflow}{if} (token.empty())}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00162}00162 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Missing frame name: "{}} + line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00163}00163 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00164}00164 \textcolor{keywordflow}{if} (token[token.size() -\/ 1U] == \textcolor{charliteral}{':'})}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00165}00165 token.erase (token.size() -\/ 1U, 1U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00166}00166 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00167}00167 frame.\mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}} = token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00168}00168 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00169}00169 \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00170}00170 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{int} dlcValue = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00171}00171 stream >> dlcValue;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00172}00172 frame.\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}} = \textcolor{keyword}{static\_cast<}std::uint8\_t\textcolor{keyword}{>} (dlcValue);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00173}00173 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00174}00174 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00175}00175 stream >> frame.\mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00176}00176 frame.\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}} = \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{TryExtractPgn}} (frame.\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}}, frame.\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}}, frame.\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00177}00177 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00178}00178 \textcolor{keywordflow}{return} frame;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00179}00179 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00180}00180 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00181}\mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{00181}} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{DbcParser::ParseSignalLine}} (\textcolor{keyword}{const} std::string \&line) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00182}00182 \textcolor{comment}{/*}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00183}00183 \textcolor{comment}{ * Example:}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00184}00184 \textcolor{comment}{ * SG\_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "{}rpm"{} ECU1,ECU2}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00185}00185 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00186}00186 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00187}00187 \mbox{\hyperlink{structSignalInfo}{SignalInfo}} signal;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00188}00188 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00189}00189 std::string work = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00190}00190 \textcolor{keywordflow}{if} (work.compare (0U, 4U, \textcolor{stringliteral}{"{}SG\_ "{}}) != 0)}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00191}00191 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Invalid signal line: "{}} + line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00192}00192 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00193}00193 work.erase (0U, 4U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00194}00194 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00195}00195 \textcolor{keyword}{const} std::string::size\_type colonPos = work.find (\textcolor{charliteral}{':'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00196}00196 \textcolor{keywordflow}{if} (colonPos == std::string::npos)}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00197}00197 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Signal line missing ':' : "{}} + line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00198}00198 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00199}00199 signal.\mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}} = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (work.substr (0U, colonPos));}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00200}00200 std::string rest = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (work.substr (colonPos + 1U));}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00201}00201 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00202}00202 \textcolor{keyword}{const} std::string::size\_type pipePos = rest.find (\textcolor{charliteral}{'|'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00203}00203 \textcolor{keyword}{const} std::string::size\_type atPos = rest.find (\textcolor{charliteral}{'@'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00204}00204 \textcolor{keyword}{const} std::string::size\_type signPos = rest.find\_first\_of (\textcolor{stringliteral}{"{}+-\/"{}}, atPos);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00205}00205 \textcolor{keyword}{const} std::string::size\_type factorBegin = rest.find (\textcolor{charliteral}{'('});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00206}00206 \textcolor{keyword}{const} std::string::size\_type factorComma = rest.find (\textcolor{charliteral}{','}, factorBegin);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00207}00207 \textcolor{keyword}{const} std::string::size\_type factorEnd = rest.find (\textcolor{charliteral}{')'}, factorComma);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00208}00208 \textcolor{keyword}{const} std::string::size\_type rangeBegin = rest.find (\textcolor{charliteral}{'['});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00209}00209 \textcolor{keyword}{const} std::string::size\_type rangeSep = rest.find (\textcolor{charliteral}{'|'}, rangeBegin);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00210}00210 \textcolor{keyword}{const} std::string::size\_type rangeEnd = rest.find (\textcolor{charliteral}{']'}, rangeSep);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00211}00211 \textcolor{keyword}{const} std::string::size\_type unitBegin = rest.find (\textcolor{charliteral}{'"{}'}, rangeEnd);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00212}00212 \textcolor{keyword}{const} std::string::size\_type unitEnd = rest.find (\textcolor{charliteral}{'"{}'}, unitBegin + 1U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00213}00213 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00214}00214 \textcolor{keywordflow}{if} ((pipePos == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00215}00215 (atPos == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00216}00216 (signPos == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00217}00217 (factorBegin == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00218}00218 (factorComma == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00219}00219 (factorEnd == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00220}00220 (rangeBegin == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00221}00221 (rangeSep == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00222}00222 (rangeEnd == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00223}00223 (unitBegin == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00224}00224 (unitEnd == std::string::npos))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00225}00225 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Unsupported signal syntax: "{}} + line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00226}00226 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00227}00227 signal.\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}} = \textcolor{keyword}{static\_cast<}std::uint32\_t\textcolor{keyword}{>} (}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00228}00228 std::stoul (\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (0U, pipePos)))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00229}00229 );}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00230}00230 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00231}00231 signal.\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}} = \textcolor{keyword}{static\_cast<}std::uint32\_t\textcolor{keyword}{>} (}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00232}00232 std::stoul (\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (pipePos + 1U, atPos -\/ pipePos -\/ 1U)))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00233}00233 );}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00234}00234 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00235}00235 \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00236}00236 \textcolor{keywordflow}{if} ((atPos + 1U) >= rest.size())}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00237}00237 \textcolor{keywordflow}{throw} std::runtime\_error (\textcolor{stringliteral}{"{}Invalid endianness in signal: "{}} + line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00238}00238 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00239}00239 \textcolor{keyword}{const} \textcolor{keywordtype}{char} endianChar = rest[atPos + 1U];}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00240}00240 signal.\mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}} = (endianChar == \textcolor{charliteral}{'1'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00241}00241 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00242}00242 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00243}00243 \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00244}00244 \textcolor{keyword}{const} \textcolor{keywordtype}{char} signChar = rest[signPos];}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00245}00245 signal.\mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}} = (signChar == \textcolor{charliteral}{'-\/'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00246}00246 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00247}00247 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00248}00248 signal.\mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}} = std::stod (}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00249}00249 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (factorBegin + 1U, factorComma -\/ factorBegin -\/ 1U))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00250}00250 );}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00251}00251 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00252}00252 signal.\mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}} = std::stod (}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00253}00253 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (factorComma + 1U, factorEnd -\/ factorComma -\/ 1U))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00254}00254 );}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00255}00255 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00256}00256 signal.\mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}} = std::stod (}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00257}00257 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (rangeBegin + 1U, rangeSep -\/ rangeBegin -\/ 1U))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00258}00258 );}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00259}00259 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00260}00260 signal.\mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}} = std::stod (}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00261}00261 \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (rangeSep + 1U, rangeEnd -\/ rangeSep -\/ 1U))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00262}00262 );}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00263}00263 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00264}00264 signal.\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}} = rest.substr (unitBegin + 1U, unitEnd -\/ unitBegin -\/ 1U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00265}00265 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00266}00266 \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00267}00267 \textcolor{keyword}{const} std::string receiversText = \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{TrimText}} (rest.substr (unitEnd + 1U));}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00268}00268 signal.\mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}} = \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{SplitReceivers}} (receiversText);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00269}00269 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00270}00270 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00271}00271 \textcolor{keywordflow}{return} signal;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00272}00272 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00273}00273 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00274}\mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{00274}} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{DbcParser::ParseCommentLine}} (\textcolor{keyword}{const} std::string \&line, \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00275}00275 \textcolor{comment}{/*}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00276}00276 \textcolor{comment}{ * Examples:}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00277}00277 \textcolor{comment}{ * CM\_ BO\_ 256 "{}Frame comment"{};}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00278}00278 \textcolor{comment}{ * CM\_ SG\_ 256 EngineSpeed "{}Signal comment"{};}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00279}00279 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00280}00280 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00281}00281 std::istringstream stream (line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00282}00282 std::string token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00283}00283 stream >> token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00284}00284 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00285}00285 \textcolor{keywordflow}{if} (token != \textcolor{stringliteral}{"{}CM\_"{}})}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00286}00286 \textcolor{keywordflow}{return};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00287}00287 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00288}00288 stream >> token;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00289}00289 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00290}00290 \textcolor{keywordflow}{if} (token == \textcolor{stringliteral}{"{}BO\_"{}}) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00291}00291 std::uint32\_t rawCanId = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00292}00292 std::uint32\_t canId = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00293}00293 \textcolor{keywordtype}{bool} isExtended = \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00294}00294 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00295}00295 stream >> rawCanId;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00296}00296 \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (rawCanId, canId, isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00297}00297 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00298}00298 \textcolor{keyword}{const} std::string::size\_type quoteBegin = line.find (\textcolor{charliteral}{'"{}'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00299}00299 \textcolor{keyword}{const} std::string::size\_type quoteEnd = line.rfind (\textcolor{charliteral}{'"{}'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00300}00300 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00301}00301 \textcolor{keywordflow}{if} ((quoteBegin == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00302}00302 (quoteEnd == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00303}00303 (quoteEnd <= quoteBegin))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00304}00304 \textcolor{keywordflow}{return};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00305}00305 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00306}00306 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *frame = \mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{FindFrameById}} (database, canId, isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00307}00307 \textcolor{keywordflow}{if} (frame != \textcolor{keyword}{nullptr})}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00308}00308 frame-\/>\mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}} = line.substr (quoteBegin + 1U, quoteEnd -\/ quoteBegin -\/ 1U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00309}00309 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (token == \textcolor{stringliteral}{"{}SG\_"{}}) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00310}00310 std::uint32\_t rawCanId = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00311}00311 std::uint32\_t canId = 0U;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00312}00312 \textcolor{keywordtype}{bool} isExtended = \textcolor{keyword}{false};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00313}00313 std::string signalName;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00314}00314 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00315}00315 stream >> rawCanId;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00316}00316 stream >> signalName;}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00317}00317 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00318}00318 \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (rawCanId, canId, isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00319}00319 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00320}00320 \textcolor{keyword}{const} std::string::size\_type quoteBegin = line.find (\textcolor{charliteral}{'"{}'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00321}00321 \textcolor{keyword}{const} std::string::size\_type quoteEnd = line.rfind (\textcolor{charliteral}{'"{}'});}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00322}00322 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00323}00323 \textcolor{keywordflow}{if} ((quoteBegin == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00324}00324 (quoteEnd == std::string::npos) ||}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00325}00325 (quoteEnd <= quoteBegin))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00326}00326 \textcolor{keywordflow}{return};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00327}00327 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00328}00328 \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *frame = \mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{FindFrameById}} (database, canId, isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00329}00329 \textcolor{keywordflow}{if} (frame != \textcolor{keyword}{nullptr}) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00330}00330 \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *signal = \mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{FindSignalByName}} (*frame, signalName);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00331}00331 \textcolor{keywordflow}{if} (signal != \textcolor{keyword}{nullptr})}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00332}00332 signal-\/>\mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}} = line.substr (quoteBegin + 1U, quoteEnd -\/ quoteBegin -\/ 1U);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00333}00333 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00334}00334 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00335}00335 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00336}00336 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00337}\mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{00337}} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{DbcParser::FindFrameById}} (\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00338}00338 std::uint32\_t canId,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00339}00339 \textcolor{keywordtype}{bool} isExtended) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00340}00340 \textcolor{keywordflow}{for} (std::size\_t index = 0U; index < database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.size(); ++index) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00341}00341 \textcolor{keywordflow}{if} ((database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[index].canId == canId) \&\&}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00342}00342 (database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[index].isExtended == isExtended))}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00343}00343 \textcolor{keywordflow}{return} \&database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[index];}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00344}00344 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00345}00345 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00346}00346 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00347}00347 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00348}00348 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00349}\mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{00349}} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{DbcParser::FindSignalByName}} (\mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame, \textcolor{keyword}{const} std::string \&signalName) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00350}00350 \textcolor{keywordflow}{for} (std::size\_t index = 0U; index < frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.size(); ++index) \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00351}00351 \textcolor{keywordflow}{if} (frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[index].name == signalName)}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00352}00352 \textcolor{keywordflow}{return} \&frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[index];}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00353}00353 \}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00354}00354 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00355}00355 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8cpp_source_l00356}00356 \}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__parser_8h.tex b/docs/latex/dbc__parser_8h.tex
new file mode 100644
index 0000000..279248f
--- /dev/null
+++ b/docs/latex/dbc__parser_8h.tex
@@ -0,0 +1,25 @@
+\hypertarget{dbc__parser_8h}{}\doxysection{dbc\+\_\+parser.\+h File Reference}
+\label{dbc__parser_8h}\index{dbc\_parser.h@{dbc\_parser.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$string$>$}\newline
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$cstdint$>$}\newline
+{\ttfamily \#include \char`\"{}dbc\+\_\+database.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classDbcParser}{Dbc\+Parser}}
+\begin{DoxyCompactList}\small\item\em Minimal DBC parser. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__parser_8h_source}{dbc\+\_\+parser.\+h}}.
+
diff --git a/docs/latex/dbc__parser_8h_source.tex b/docs/latex/dbc__parser_8h_source.tex
new file mode 100644
index 0000000..d432cc4
--- /dev/null
+++ b/docs/latex/dbc__parser_8h_source.tex
@@ -0,0 +1,74 @@
+\hypertarget{dbc__parser_8h_source}{}\doxysection{dbc\+\_\+parser.\+h}
+\mbox{\hyperlink{dbc__parser_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_parser.h}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_PARSER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_PARSER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00018}00018 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00019}00019 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__database_8h}{dbc\_database.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00020}00020 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00021}00021 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00022}00022 \textcolor{comment}{ * @brief Minimal DBC parser.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00023}00023 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00024}00024 \textcolor{comment}{ * Supports:}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00025}00025 \textcolor{comment}{ * -\/ BO\_}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00026}00026 \textcolor{comment}{ * -\/ SG\_}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00027}00027 \textcolor{comment}{ * -\/ CM\_ BO\_}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00028}00028 \textcolor{comment}{ * -\/ CM\_ SG\_}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00029}00029 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00030}00030 \textcolor{comment}{ * Ignores:}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00031}00031 \textcolor{comment}{ * -\/ attributes}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00032}00032 \textcolor{comment}{ * -\/ multiplexing}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00033}00033 \textcolor{comment}{ * -\/ value tables}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00034}00034 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00035}\mbox{\hyperlink{classDbcParser}{00035}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcParser}{DbcParser}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00036}00036 \textcolor{keyword}{public}:\textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00037}00037 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00038}00038 \textcolor{comment}{ * @brief Parse DBC file.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00039}00039 \textcolor{comment}{ * @param filePath Path to input file.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00040}00040 \textcolor{comment}{ * @return Parsed database.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00041}00041 \textcolor{comment}{ * @throws std::runtime\_error on file or parse errors.}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00042}00042 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00043}00043 \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{ParseFile}} (\textcolor{keyword}{const} std::string \&filePath) \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00044}00044 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00045}00045 \textcolor{keyword}{private}:}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00046}00046 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ada086584d371c08dd93b75fb7965f13b}{IsFrameLine}} (\textcolor{keyword}{const} std::string \&line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00047}00047 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ace3d3432a55707bc286a994aa205fed1}{IsSignalLine}} (\textcolor{keyword}{const} std::string \&line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00048}00048 \textcolor{keyword}{static} \textcolor{keywordtype}{bool} \mbox{\hyperlink{classDbcParser_ae3488a0a6c64dc95e4ed289e77579feb}{IsCommentLine}} (\textcolor{keyword}{const} std::string \&line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00049}00049 \textcolor{keyword}{static} std::string \mbox{\hyperlink{classDbcParser_a1ae77c4c356af3d7b01a30044366f02b}{Trim}} (\textcolor{keyword}{const} std::string \&text);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00050}00050 \textcolor{keyword}{static} std::vector \mbox{\hyperlink{classDbcParser_a0c1cc3c58f33473bf426a77b7a25c529}{SplitReceivers}} (\textcolor{keyword}{const} std::string \&text);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00051}00051 \textcolor{keyword}{static} std::uint32\_t \mbox{\hyperlink{classDbcParser_a8a7e8fc517e40beab87a8a1dbad2b324}{TryExtractPgn}} (std::uint32\_t canId, \textcolor{keywordtype}{bool} isExtended, \textcolor{keywordtype}{bool} \&hasPgn);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00052}00052 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00053}00053 \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_a94d140d9442e4989b5b2ea7662c2debf}{NormalizeCanId}} (std::uint32\_t rawCanId,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00054}00054 std::uint32\_t \&normalizedCanId,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00055}00055 \textcolor{keywordtype}{bool} \&isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00056}00056 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00057}00057 \textcolor{keyword}{static} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \mbox{\hyperlink{classDbcParser_a6d73bb1885e59aecd8202e93a7cd392a}{ParseFrameLine}} (\textcolor{keyword}{const} std::string \&line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00058}00058 \textcolor{keyword}{static} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \mbox{\hyperlink{classDbcParser_a4cbce88d08b1f72903ecf1bce41de5d2}{ParseSignalLine}} (\textcolor{keyword}{const} std::string \&line);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00059}00059 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00060}00060 \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{classDbcParser_aa662b34694fd8b3edd757f36cb064c5c}{ParseCommentLine}} (\textcolor{keyword}{const} std::string \&line, \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00061}00061 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00062}00062 \textcolor{keyword}{static} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classDbcParser_ab1fee32cb845573ce10949b4bec721f9}{FindFrameById}} (\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00063}00063 std::uint32\_t canId,}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00064}00064 \textcolor{keywordtype}{bool} isExtended);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00065}00065 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00066}00066 \textcolor{keyword}{static} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classDbcParser_ab7b95be4433c56cc855bedb08b96a71a}{FindSignalByName}} (\mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame, \textcolor{keyword}{const} std::string \&signalName);}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00067}00067 \};}
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00068}00068 }
+\DoxyCodeLine{\Hypertarget{dbc__parser_8h_source_l00069}00069 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_PARSER\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__tree__builder_8cpp.tex b/docs/latex/dbc__tree__builder_8cpp.tex
new file mode 100644
index 0000000..be42ae0
--- /dev/null
+++ b/docs/latex/dbc__tree__builder_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{dbc__tree__builder_8cpp}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+cpp File Reference}
+\label{dbc__tree__builder_8cpp}\index{dbc\_tree\_builder.cpp@{dbc\_tree\_builder.cpp}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include \char`\"{}dbc\+\_\+tree\+\_\+builder.\+h\char`\"{}}\newline
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__tree__builder_8cpp_source}{dbc\+\_\+tree\+\_\+builder.\+cpp}}.
+
diff --git a/docs/latex/dbc__tree__builder_8cpp_source.tex b/docs/latex/dbc__tree__builder_8cpp_source.tex
new file mode 100644
index 0000000..be46d47
--- /dev/null
+++ b/docs/latex/dbc__tree__builder_8cpp_source.tex
@@ -0,0 +1,36 @@
+\hypertarget{dbc__tree__builder_8cpp_source}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+cpp}
+\mbox{\hyperlink{dbc__tree__builder_8cpp}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00002}00002 \textcolor{comment}{ * @file dbc\_tree\_builder.cpp}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\_tree\_builder.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00013}00013 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00014}\mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{00014}} std::unique\_ptr \mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{DbcTreeBuilder::Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00015}00015 std::unique\_ptr root (\textcolor{keyword}{new} \mbox{\hyperlink{classTreeNode}{TreeNode}}());}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00016}00016 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00017}00017 \textcolor{keywordflow}{for} (std::size\_t frameIndex = 0U; frameIndex < database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}.size(); ++frameIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00018}00018 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame = database.\mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}[frameIndex];}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00019}00019 std::unique\_ptr frameNode (\textcolor{keyword}{new} \mbox{\hyperlink{classTreeNode}{TreeNode}} (frame));}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00020}00020 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00021}00021 \textcolor{keywordflow}{for} (std::size\_t signalIndex = 0U; signalIndex < frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}.size(); ++signalIndex) \{}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00022}00022 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&signal = frame.\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}[signalIndex];}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00023}00023 std::unique\_ptr signalNode (\textcolor{keyword}{new} \mbox{\hyperlink{classTreeNode}{TreeNode}} (signal));}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00024}00024 frameNode-\/>AddChild (std::move (signalNode));}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00025}00025 \}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00026}00026 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00027}00027 root-\/>AddChild (std::move (frameNode));}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00028}00028 \}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00029}00029 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00030}00030 \textcolor{keywordflow}{return} root;}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8cpp_source_l00031}00031 \}}
+
+\end{DoxyCode}
diff --git a/docs/latex/dbc__tree__builder_8h.tex b/docs/latex/dbc__tree__builder_8h.tex
new file mode 100644
index 0000000..9513cbb
--- /dev/null
+++ b/docs/latex/dbc__tree__builder_8h.tex
@@ -0,0 +1,24 @@
+\hypertarget{dbc__tree__builder_8h}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+h File Reference}
+\label{dbc__tree__builder_8h}\index{dbc\_tree\_builder.h@{dbc\_tree\_builder.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$memory$>$}\newline
+{\ttfamily \#include \char`\"{}dbc\+\_\+database.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tree\+\_\+node.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classDbcTreeBuilder}{Dbc\+Tree\+Builder}}
+\begin{DoxyCompactList}\small\item\em Builds a simple tree from parsed DBC database. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{dbc__tree__builder_8h_source}{dbc\+\_\+tree\+\_\+builder.\+h}}.
+
diff --git a/docs/latex/dbc__tree__builder_8h_source.tex b/docs/latex/dbc__tree__builder_8h_source.tex
new file mode 100644
index 0000000..afb9f12
--- /dev/null
+++ b/docs/latex/dbc__tree__builder_8h_source.tex
@@ -0,0 +1,38 @@
+\hypertarget{dbc__tree__builder_8h_source}{}\doxysection{dbc\+\_\+tree\+\_\+builder.\+h}
+\mbox{\hyperlink{dbc__tree__builder_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00002}00002 \textcolor{comment}{ * @file dbc\_tree\_builder.h}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DBC\_TREE\_BUILDER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DBC\_TREE\_BUILDER\_H}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00016}00016 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00017}00017 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__database_8h}{dbc\_database.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00018}00018 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{tree__node_8h}{tree\_node.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00019}00019 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00020}00020 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00021}00021 \textcolor{comment}{ * @brief Builds a simple tree from parsed DBC database.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00022}00022 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00023}\mbox{\hyperlink{classDbcTreeBuilder}{00023}} \textcolor{keyword}{class }\mbox{\hyperlink{classDbcTreeBuilder}{DbcTreeBuilder}} \{}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00024}00024 \textcolor{keyword}{public}:\textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00025}00025 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00026}00026 \textcolor{comment}{ * @brief Build tree representation of parsed DBC data.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00027}00027 \textcolor{comment}{ * @param database Parsed database.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00028}00028 \textcolor{comment}{ * @return Root node of the tree.}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00029}00029 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00030}00030 std::unique\_ptr \mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} \&database) \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00031}00031 \};}
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00032}00032 }
+\DoxyCodeLine{\Hypertarget{dbc__tree__builder_8h_source_l00033}00033 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DBC\_TREE\_BUILDER\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/decode__database_8h.tex b/docs/latex/decode__database_8h.tex
new file mode 100644
index 0000000..723b99c
--- /dev/null
+++ b/docs/latex/decode__database_8h.tex
@@ -0,0 +1,95 @@
+\hypertarget{decode__database_8h}{}\doxysection{decode\+\_\+database.\+h File Reference}
+\label{decode__database_8h}\index{decode\_database.h@{decode\_database.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$string$>$}\newline
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$unordered\+\_\+map$>$}\newline
+{\ttfamily \#include $<$cstdint$>$}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}
+\begin{DoxyCompactList}\small\item\em Runtime-\/ready signal definition. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}
+\begin{DoxyCompactList}\small\item\em Runtime-\/ready frame definition. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structFrameKey}{Frame\+Key}}
+\begin{DoxyCompactList}\small\item\em Key for fast frame lookup. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}}
+\begin{DoxyCompactList}\small\item\em Hasher for frame key. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}
+\begin{DoxyCompactList}\small\item\em Runtime decode database with fast lookup by CAN ID. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum class \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}} \{ \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}}
+, \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{Motorola}}
+ \}
+\begin{DoxyCompactList}\small\item\em Signal byte order used for runtime decoding. \end{DoxyCompactList}\item
+enum class \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}} \{ \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}}
+, \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}
+ \}
+\begin{DoxyCompactList}\small\item\em Signal numeric type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Enumeration Type Documentation}
+\mbox{\Hypertarget{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}\label{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}}
+\index{decode\_database.h@{decode\_database.h}!ByteOrder@{ByteOrder}}
+\index{ByteOrder@{ByteOrder}!decode\_database.h@{decode\_database.h}}
+\doxysubsubsection{\texorpdfstring{ByteOrder}{ByteOrder}}
+{\footnotesize\ttfamily enum class \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}}\hspace{0.3cm}{\ttfamily [strong]}}
+
+
+
+Signal byte order used for runtime decoding.
+
+\begin{DoxyEnumFields}{Enumerator}
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Intel@{Intel}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Intel@{Intel}}}\mbox{\Hypertarget{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}\label{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}}
+Intel&\\
+\hline
+
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Motorola@{Motorola}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Motorola@{Motorola}}}\mbox{\Hypertarget{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}\label{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}}
+Motorola&\\
+\hline
+
+\end{DoxyEnumFields}
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00023}{23}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+\mbox{\Hypertarget{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}\label{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}}
+\index{decode\_database.h@{decode\_database.h}!ValueType@{ValueType}}
+\index{ValueType@{ValueType}!decode\_database.h@{decode\_database.h}}
+\doxysubsubsection{\texorpdfstring{ValueType}{ValueType}}
+{\footnotesize\ttfamily enum class \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}}\hspace{0.3cm}{\ttfamily [strong]}}
+
+
+
+Signal numeric type.
+
+\begin{DoxyEnumFields}{Enumerator}
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Unsigned@{Unsigned}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Unsigned@{Unsigned}}}\mbox{\Hypertarget{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}\label{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}}
+Unsigned&\\
+\hline
+
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Signed@{Signed}!decode\_database.h@{decode\_database.h}}\index{decode\_database.h@{decode\_database.h}!Signed@{Signed}}}\mbox{\Hypertarget{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}\label{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}}
+Signed&\\
+\hline
+
+\end{DoxyEnumFields}
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00031}{31}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
diff --git a/docs/latex/decode__database_8h_source.tex b/docs/latex/decode__database_8h_source.tex
new file mode 100644
index 0000000..00dd311
--- /dev/null
+++ b/docs/latex/decode__database_8h_source.tex
@@ -0,0 +1,142 @@
+\hypertarget{decode__database_8h_source}{}\doxysection{decode\+\_\+database.\+h}
+\mbox{\hyperlink{decode__database_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00002}00002 \textcolor{comment}{ * @file decode\_database.h}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef DECODE\_DATABASE\_H}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00013}00013 \textcolor{preprocessor}{\#define DECODE\_DATABASE\_H}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00018}00018 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00019}00019 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00020}00020 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00021}00021 \textcolor{comment}{ * @brief Signal byte order used for runtime decoding.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00022}00022 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00023}\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{00023}} \textcolor{keyword}{enum class} \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{ByteOrder}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00024}00024 \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}},}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00025}00025 \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142ba2ed1afe3c9215523e4272f46e6186b31}{Motorola}}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00026}00026 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00027}00027 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00028}00028 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00029}00029 \textcolor{comment}{ * @brief Signal numeric type.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00030}00030 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00031}\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{00031}} \textcolor{keyword}{enum class} \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{ValueType}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00032}00032 \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}},}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00033}00033 \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1a71fed0c3428bf1a2e19af257c4bac379}{Signed}}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00034}00034 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00035}00035 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00036}00036 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00037}00037 \textcolor{comment}{ * @brief Runtime-\/ready signal definition.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00038}00038 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00039}\mbox{\hyperlink{structDecodeSignal}{00039}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodeSignal}{DecodeSignal}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00040}\mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{00040}} std::string \mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}; \textcolor{comment}{/**< Signal name. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00041}\mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{00041}} std::uint32\_t \mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}}; \textcolor{comment}{/**< DBC start bit. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00042}\mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{00042}} std::uint32\_t \mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}; \textcolor{comment}{/**< Signal length in bits. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00043}\mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{00043}} \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{ByteOrder}} \mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}}; \textcolor{comment}{/**< Intel or Motorola. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00044}\mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{00044}} \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{ValueType}} \mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}}; \textcolor{comment}{/**< Signed or unsigned. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00045}\mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{00045}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}}; \textcolor{comment}{/**< Scaling factor. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00046}\mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{00046}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}}; \textcolor{comment}{/**< Physical offset. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00047}\mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{00047}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}}; \textcolor{comment}{/**< Minimum physical value. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00048}\mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{00048}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}}; \textcolor{comment}{/**< Maximum physical value. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00049}\mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{00049}} std::string \mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}; \textcolor{comment}{/**< Physical unit. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00050}\mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{00050}} std::vector \mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}}; \textcolor{comment}{/**< Receivers. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00051}\mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{00051}} std::string \mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}}; \textcolor{comment}{/**< Comment. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00052}00052 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00053}\mbox{\hyperlink{structDecodeSignal_a93fd97267e2614979440261628e493f5}{00053}} \mbox{\hyperlink{structDecodeSignal_a93fd97267e2614979440261628e493f5}{DecodeSignal}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00054}00054 : \mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00055}00055 , \mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{startBit}} (0U)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00056}00056 , \mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}} (0U)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00057}00057 , \mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byteOrder}} (\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{ByteOrder}}::\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142baff97a9fdede09eaf6e1c8ec9f6a61dd5}{Intel}})}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00058}00058 , \mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{valueType}} (\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{ValueType}}::\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1aa1a914735b205424ba6c40b85528d78a}{Unsigned}})}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00059}00059 , \mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}} (1.0)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00060}00060 , \mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}} (0.0)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00061}00061 , \mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}} (0.0)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00062}00062 , \mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}} (0.0)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00063}00063 , \mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00064}00064 , \mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00065}00065 , \mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}}() \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00066}00066 \}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00067}00067 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00068}00068 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00069}00069 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00070}00070 \textcolor{comment}{ * @brief Runtime-\/ready frame definition.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00071}00071 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00072}\mbox{\hyperlink{structDecodeFrame}{00072}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodeFrame}{DecodeFrame}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00073}\mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{00073}} std::string \mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}}; \textcolor{comment}{/**< Frame name. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00074}\mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{00074}} std::uint32\_t \mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}}; \textcolor{comment}{/**< Normalized CAN ID. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00075}\mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{00075}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}}; \textcolor{comment}{/**< true for extended frame. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00076}\mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{00076}} std::uint8\_t \mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}}; \textcolor{comment}{/**< Payload length. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00077}\mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{00077}} std::uint32\_t \mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}}; \textcolor{comment}{/**< PGN if available. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00078}\mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{00078}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{hasPgn}}; \textcolor{comment}{/**< true if PGN is valid. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00079}\mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{00079}} std::string \mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}}; \textcolor{comment}{/**< Transmitter ECU. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00080}\mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{00080}} std::string \mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}}; \textcolor{comment}{/**< Frame comment. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00081}\mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{00081}} std::vector \mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}; \textcolor{comment}{/**< Signal definitions. */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00082}00082 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00083}\mbox{\hyperlink{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}{00083}} \mbox{\hyperlink{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}{DecodeFrame}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00084}00084 : \mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00085}00085 , \mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{canId}} (0U)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00086}00086 , \mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{isExtended}} (false)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00087}00087 , \mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}} (0U)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00088}00088 , \mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}} (0U)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00089}00089 , \mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{hasPgn}} (false)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00090}00090 , \mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00091}00091 , \mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00092}00092 , \mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}() \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00093}00093 \}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00094}00094 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00095}00095 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00096}00096 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00097}00097 \textcolor{comment}{ * @brief Key for fast frame lookup.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00098}00098 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00099}\mbox{\hyperlink{structFrameKey}{00099}} \textcolor{keyword}{struct }\mbox{\hyperlink{structFrameKey}{FrameKey}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00100}\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{00100}} std::uint32\_t \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00101}\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{00101}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00102}00102 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00103}\mbox{\hyperlink{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}{00103}} \mbox{\hyperlink{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}{FrameKey}}()}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00104}00104 : \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}} (0U)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00105}00105 , \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} (false) \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00106}00106 \}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00107}00107 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00108}\mbox{\hyperlink{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}{00108}} \mbox{\hyperlink{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}{FrameKey}} (std::uint32\_t \textcolor{keywordtype}{id}, \textcolor{keywordtype}{bool} extended)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00109}00109 : \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}} (id)}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00110}00110 , \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} (extended) \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00111}00111 \}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00112}00112 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00113}\mbox{\hyperlink{structFrameKey_aaaec9f914e127787247fcda5e183b01f}{00113}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameKey_aaaec9f914e127787247fcda5e183b01f}{operator== }}(\textcolor{keyword}{const} \mbox{\hyperlink{structFrameKey}{FrameKey}} \&other)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00114}00114 \textcolor{keywordflow}{return} (\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}} == other.\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}}) \&\& (\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} == other.\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}});}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00115}00115 \}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00116}00116 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00117}00117 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00118}00118 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00119}00119 \textcolor{comment}{ * @brief Hasher for frame key.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00120}00120 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00121}\mbox{\hyperlink{structFrameKeyHasher}{00121}} \textcolor{keyword}{struct }\mbox{\hyperlink{structFrameKeyHasher}{FrameKeyHasher}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00122}\mbox{\hyperlink{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}{00122}} std::size\_t \mbox{\hyperlink{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}{operator() }}(\textcolor{keyword}{const} \mbox{\hyperlink{structFrameKey}{FrameKey}} \&key)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00123}00123 \textcolor{keyword}{const} std::size\_t a = \textcolor{keyword}{static\_cast<}std::size\_t\textcolor{keyword}{>} (key.\mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{canId}});}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00124}00124 \textcolor{keyword}{const} std::size\_t b = key.\mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{isExtended}} ? 1U : 0U;}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00125}00125 \textcolor{keywordflow}{return} (a * 1315423911U) \string^ b;}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00126}00126 \}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00127}00127 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00128}00128 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00129}00129 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00130}00130 \textcolor{comment}{ * @brief Runtime decode database with fast lookup by CAN ID.}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00131}00131 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00132}\mbox{\hyperlink{structDecodeDatabase}{00132}} \textcolor{keyword}{struct }\mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} \{}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00133}\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{00133}} std::vector \mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00134}\mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{00134}} std::unordered\_map \mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frameIndexByKey}};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00135}00135 \};}
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00136}00136 }
+\DoxyCodeLine{\Hypertarget{decode__database_8h_source_l00137}00137 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* DECODE\_DATABASE\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/doxygen.sty b/docs/latex/doxygen.sty
new file mode 100644
index 0000000..bde67ed
--- /dev/null
+++ b/docs/latex/doxygen.sty
@@ -0,0 +1,596 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{calc}
+\RequirePackage{float}
+%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{longtable_doxygen}
+\RequirePackage{tabu_doxygen}
+\RequirePackage{fancyvrb}
+\RequirePackage{tabularx}
+\RequirePackage{multicol}
+\RequirePackage{multirow}
+\RequirePackage{hanging}
+\RequirePackage{ifpdf}
+\RequirePackage{adjustbox}
+\RequirePackage{amssymb}
+\RequirePackage{stackengine}
+\RequirePackage{enumitem}
+\RequirePackage{alphalph}
+\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis
+\RequirePackage{enumitem}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyHorRuler}[1]{%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{#1=0}%
+ {%
+ \hrule%
+ }%
+ {%
+ \hrulefilll%
+ }%
+}
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ %\setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by ...
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output.
+\newlength{\CodeWidthChar}
+\newlength{\CodeHeightChar}
+\settowidth{\CodeWidthChar}{?}
+\settoheight{\CodeHeightChar}{?}
+% Necessary for hanging indent
+\newlength{\DoxyCodeWidth}
+
+\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par}
+
+\newcommand\NiceSpace{%
+ \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}[1]{%
+ \par%
+ \scriptsize%
+ \normalfont\ttfamily%
+ \rightskip0pt plus 1fil%
+ \settowidth{\DoxyCodeWidth}{000000}%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{\equal{#1}{0}}
+ {
+ {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces%
+ }
+ {
+ {\lccode`~32 \lowercase{\global\let~}}\obeyspaces%
+ }
+
+}{%
+ \normalfont%
+ \normalsize%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+}
+
+% Redefining not defined characters, i.e. "Replacement Character" in tex output.
+\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
+ \textcolor{white}{\sffamily\bfseries\small ?}}{%
+ \rotatebox{45}{$\blacksquare$}}}}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}[1]{%
+ \DoxyCode{#1}%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \par%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or ... )
+\setlistdepth{12}
+\newlist{DoxyEnumerate}{enumerate}{12}
+\setlist[DoxyEnumerate,1]{label=\arabic*.}
+\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,3]{label=\roman*.}
+\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,5]{label=\arabic*.}
+\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,7]{label=\roman*.}
+\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,9]{label=\arabic*.}
+\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,11]{label=\roman*.}
+\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.}
+
+% Used by bullet lists (using '-', @li, @arg, or )
+\setlistdepth{12}
+\newlist{DoxyItemize}{itemize}{12}
+\setlist[DoxyItemize]{label=\textperiodcentered}
+
+\setlist[DoxyItemize,1]{label=\textbullet}
+\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash}
+\setlist[DoxyItemize,3]{label=\textasteriskcentered}
+\setlist[DoxyItemize,4]{label=\textperiodcentered}
+
+% Used by description lists (using ... )
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \centering%
+}{%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+ \begin{center}%
+}{%
+ \end{center}%
+}
+
+% Used by @image
+% (only if inline is specified)
+\newenvironment{DoxyInlineImage}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \tabulinesep=1mm%
+ \par%
+ \ifthenelse{\equal{#1}{}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
+ {\ifthenelse{\equal{#1}{1}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
+ }
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields simple class style enums
+\newenvironment{DoxyEnumFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newenvironment{TabularC}[1]%
+{\tabulinesep=1mm
+\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
+{\end{longtabu*}\par}%
+
+\newenvironment{TabularNC}[1]%
+{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
+{\end{tabu}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used to link to a table when hyperlinks are turned on
+\newcommand{\doxytablelink}[2]{%
+ \ref{#1}%
+}
+
+% Used to link to a table when hyperlinks are turned off
+\newcommand{\doxytableref}[3]{%
+ \ref{#3}%
+}
+
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
+% Colors used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
+
+% Color used for table heading
+\newcommand{\tableheadbgcolor}{lightgray}%
+
+% Version of hypertarget with correct landing location
+\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
+
+% possibility to have sections etc. be within the margins
+% unfortunately had to copy part of book.cls and add \raggedright
+\makeatletter
+\newcommand\doxysection{\@startsection {section}{1}{\z@}%
+ {-3.5ex \@plus -1ex \@minus -.2ex}%
+ {2.3ex \@plus.2ex}%
+ {\raggedright\normalfont\Large\bfseries}}
+\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\large\bfseries}}
+\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}%
+ {3.25ex \@plus1ex \@minus.2ex}%
+ {-1em}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}%
+ {3.25ex \@plus1ex \@minus .2ex}%
+ {-1em}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\makeatother
+% Define caption that is also suitable in a table
+\makeatletter
+\def\doxyfigcaption{%
+\H@refstepcounter{figure}%
+\@dblarg{\@caption{figure}}}
+\makeatother
+
+% Define alpha enumarative names for counters > 26
+\makeatletter
+\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname}
+\def\@enumalphalphcnt#1{\alphalph{#1}}
+\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname}
+\def\@enumAlphAlphcnt#1{\AlphAlph{#1}}
+\makeatother
+\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa}
+\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA}
diff --git a/docs/latex/files.tex b/docs/latex/files.tex
new file mode 100644
index 0000000..6547fd2
--- /dev/null
+++ b/docs/latex/files.tex
@@ -0,0 +1,18 @@
+\doxysection{File List}
+Here is a list of all files with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__database_8h}{dbc\+\_\+database.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__database_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__decode__builder_8cpp}{dbc\+\_\+decode\+\_\+builder.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decode__builder_8cpp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\+\_\+decode\+\_\+builder.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decode__builder_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__decoder_8cpp}{dbc\+\_\+decoder.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decoder_8cpp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__decoder_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__parser_8cpp}{dbc\+\_\+parser.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__parser_8cpp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__parser_8h}{dbc\+\_\+parser.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__parser_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__tree__builder_8cpp}{dbc\+\_\+tree\+\_\+builder.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__tree__builder_8cpp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\+\_\+tree\+\_\+builder.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{dbc__tree__builder_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{decode__database_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{frame__info_8h}{frame\+\_\+info.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{frame__info_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{main_8cpp}{main.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{main_8cpp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{signal__info_8h}{signal\+\_\+info.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{signal__info_8h}}{}
+\item\contentsline{section}{\mbox{\hyperlink{tree__node_8cpp}{tree\+\_\+node.\+cpp}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{tree__node_8cpp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{tree__node_8h}{tree\+\_\+node.\+h}} \\*Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro) }{\pageref{tree__node_8h}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/frame__info_8h.tex b/docs/latex/frame__info_8h.tex
new file mode 100644
index 0000000..f5a7eac
--- /dev/null
+++ b/docs/latex/frame__info_8h.tex
@@ -0,0 +1,25 @@
+\hypertarget{frame__info_8h}{}\doxysection{frame\+\_\+info.\+h File Reference}
+\label{frame__info_8h}\index{frame\_info.h@{frame\_info.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$string$>$}\newline
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$cstdint$>$}\newline
+{\ttfamily \#include \char`\"{}signal\+\_\+info.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structFrameInfo}{Frame\+Info}}
+\begin{DoxyCompactList}\small\item\em Describes one CAN frame from a DBC file. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
diff --git a/docs/latex/frame__info_8h_source.tex b/docs/latex/frame__info_8h_source.tex
new file mode 100644
index 0000000..db57c2c
--- /dev/null
+++ b/docs/latex/frame__info_8h_source.tex
@@ -0,0 +1,53 @@
+\hypertarget{frame__info_8h_source}{}\doxysection{frame\+\_\+info.\+h}
+\mbox{\hyperlink{frame__info_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00002}00002 \textcolor{comment}{ * @file frame\_info.h}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef FRAME\_INFO\_H}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00013}00013 \textcolor{preprocessor}{\#define FRAME\_INFO\_H}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00018}00018 }
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00019}00019 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{signal__info_8h}{signal\_info.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00020}00020 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00021}00021 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00022}00022 \textcolor{comment}{ * @brief Describes one CAN frame from a DBC file.}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00023}00023 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00024}\mbox{\hyperlink{structFrameInfo}{00024}} \textcolor{keyword}{struct }\mbox{\hyperlink{structFrameInfo}{FrameInfo}} \{}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00025}\mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{00025}} std::string \mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}}; \textcolor{comment}{/**< Frame name. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00026}\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{00026}} std::uint32\_t \mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}}; \textcolor{comment}{/**< Normalized CAN identifier. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00027}\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{00027}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}}; \textcolor{comment}{/**< true for extended frame. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00028}\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{00028}} std::uint32\_t \mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}}; \textcolor{comment}{/**< J1939 PGN if applicable. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00029}\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{00029}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}}; \textcolor{comment}{/**< true if PGN was derived. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00030}\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{00030}} std::uint8\_t \mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}}; \textcolor{comment}{/**< Frame payload length. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00031}\mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{00031}} std::string \mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}}; \textcolor{comment}{/**< Transmitter ECU name. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00032}\mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{00032}} std::string \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}}; \textcolor{comment}{/**< Optional frame comment. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00033}\mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{00033}} std::vector \mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}; \textcolor{comment}{/**< Signals contained in the frame. */}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00034}00034 }
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00035}\mbox{\hyperlink{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}{00035}} \mbox{\hyperlink{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}{FrameInfo}}()}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00036}00036 : \mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}}()}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00037}00037 , \mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}} (0U)}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00038}00038 , \mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}} (false)}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00039}00039 , \mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}} (0U)}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00040}00040 , \mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}} (false)}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00041}00041 , \mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}} (0U)}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00042}00042 , \mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}}()}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00043}00043 , \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}}()}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00044}00044 , \mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}() \{}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00045}00045 \}}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00046}00046 \};}
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00047}00047 }
+\DoxyCodeLine{\Hypertarget{frame__info_8h_source_l00048}00048 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* FRAME\_INFO\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/longtable_doxygen.sty b/docs/latex/longtable_doxygen.sty
new file mode 100644
index 0000000..a0eb314
--- /dev/null
+++ b/docs/latex/longtable_doxygen.sty
@@ -0,0 +1,448 @@
+%%
+%% This is file `longtable.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% longtable.dtx (with options: `package')
+%%
+%% This is a generated file.
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at http://latex-project.org/bugs.html
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+%% without such generated files.
+%%
+%% The list of all files belonging to the LaTeX `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{longtable_doxygen}
+ [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen]
+\def\LT@err{\PackageError{longtable}}
+\def\LT@warn{\PackageWarning{longtable}}
+\def\LT@final@warn{%
+ \AtEndDocument{%
+ \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
+ \global\let\LT@final@warn\relax}
+\DeclareOption{errorshow}{%
+ \def\LT@warn{\PackageInfo{longtable}}}
+\DeclareOption{pausing}{%
+ \def\LT@warn#1{%
+ \LT@err{#1}{This is not really an error}}}
+\DeclareOption{set}{}
+\DeclareOption{final}{}
+\ProcessOptions
+\newskip\LTleft \LTleft=\fill
+\newskip\LTright \LTright=\fill
+\newskip\LTpre \LTpre=\bigskipamount
+\newskip\LTpost \LTpost=\bigskipamount
+\newcount\LTchunksize \LTchunksize=20
+\let\c@LTchunksize\LTchunksize
+\newdimen\LTcapwidth \LTcapwidth=4in
+\newbox\LT@head
+\newbox\LT@firsthead
+\newbox\LT@foot
+\newbox\LT@lastfoot
+\newcount\LT@cols
+\newcount\LT@rows
+\newcounter{LT@tables}
+\newcounter{LT@chunks}[LT@tables]
+\ifx\c@table\undefined
+ \newcounter{table}
+ \def\fnum@table{\tablename~\thetable}
+\fi
+\ifx\tablename\undefined
+ \def\tablename{Table}
+\fi
+\newtoks\LT@p@ftn
+\mathchardef\LT@end@pen=30000
+\def\longtable{%
+ \par
+ \ifx\multicols\@undefined
+ \else
+ \ifnum\col@number>\@ne
+ \@twocolumntrue
+ \fi
+ \fi
+ \if@twocolumn
+ \LT@err{longtable not in 1-column mode}\@ehc
+ \fi
+ \begingroup
+ \@ifnextchar[\LT@array{\LT@array[x]}}
+\def\LT@array[#1]#2{%
+ \refstepcounter{table}\stepcounter{LT@tables}%
+ \if l#1%
+ \LTleft\z@ \LTright\fill
+ \else\if r#1%
+ \LTleft\fill \LTright\z@
+ \else\if c#1%
+ \LTleft\fill \LTright\fill
+ \fi\fi\fi
+ \let\LT@mcol\multicolumn
+ \let\LT@@tabarray\@tabarray
+ \let\LT@@hl\hline
+ \def\@tabarray{%
+ \let\hline\LT@@hl
+ \LT@@tabarray}%
+ \let\\\LT@tabularcr\let\tabularnewline\\%
+ \def\newpage{\noalign{\break}}%
+ \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
+ \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
+ \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
+ \@tempdima\ht\strutbox
+ \let\@endpbox\LT@endpbox
+ \ifx\extrarowheight\@undefined
+ \let\@acol\@tabacol
+ \let\@classz\@tabclassz \let\@classiv\@tabclassiv
+ \def\@startpbox{\vtop\LT@startpbox}%
+ \let\@@startpbox\@startpbox
+ \let\@@endpbox\@endpbox
+ \let\LT@LL@FM@cr\@tabularcr
+ \else
+ \advance\@tempdima\extrarowheight
+ \col@sep\tabcolsep
+ \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \fi
+ \setbox\@arstrutbox\hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \let\@sharp##\let\protect\relax
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\LT@bchunk{%
+ \global\advance\c@LT@chunks\@ne
+ \global\LT@rows\z@\setbox\z@\vbox\bgroup
+ \LT@setprevdepth
+ \tabskip\LTleft \noexpand\halign to\hsize\bgroup
+ \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
+ \endgroup
+ \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
+ \LT@make@row
+ \m@th\let\par\@empty
+ \everycr{}\lineskip\z@\baselineskip\z@
+ \LT@bchunk}
+\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}
+\def\LT@start{%
+ \let\LT@start\endgraf
+ \endgraf\penalty\z@\vskip\LTpre
+ \dimen@\pagetotal
+ \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \ht\LT@foot
+ \dimen@ii\vfuzz
+ \vfuzz\maxdimen
+ \setbox\tw@\copy\z@
+ \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
+ \setbox\tw@\vbox{\unvbox\tw@}%
+ \vfuzz\dimen@ii
+ \advance\dimen@ \ht
+ \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@\dp
+ \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@ -\pagegoal
+ \ifdim \dimen@>\z@\vfil\break\fi
+ \global\@colroom\@colht
+ \ifvoid\LT@foot\else
+ \advance\vsize-\ht\LT@foot
+ \global\advance\@colroom-\ht\LT@foot
+ \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
+ \maxdepth\z@
+ \fi
+ \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
+ \output{\LT@output}}
+\def\endlongtable{%
+ \crcr
+ \noalign{%
+ \let\LT@entry\LT@entry@chop
+ \xdef\LT@save@row{\LT@save@row}}%
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \if@filesw
+ {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
+ \gdef\expandafter\noexpand
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ {\LT@save@row}}}%
+ \fi
+ \ifx\LT@save@row\LT@@save@row
+ \else
+ \LT@warn{Column \@width s have changed\MessageBreak
+ in table \thetable}%
+ \LT@final@warn
+ \fi
+ \endgraf\penalty -\LT@end@pen
+ \endgroup
+ \global\@mparbottom\z@
+ \pagegoal\vsize
+ \endgraf\penalty\z@\addvspace\LTpost
+ \ifvoid\footins\else\insert\footins{}\fi}
+\def\LT@nofcols#1&{%
+ \futurelet\@let@token\LT@n@fcols}
+\def\LT@n@fcols{%
+ \advance\LT@cols\@ne
+ \ifx\@let@token\LT@nofcols
+ \expandafter\@gobble
+ \else
+ \expandafter\LT@nofcols
+ \fi}
+\def\LT@tabularcr{%
+ \relax\iffalse{\fi\ifnum0=`}\fi
+ \@ifstar
+ {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
+ \LT@t@bularcr}%
+ {\LT@t@bularcr}}
+\let\LT@crcr\crcr
+\let\LT@setprevdepth\relax
+\def\LT@t@bularcr{%
+ \global\advance\LT@rows\@ne
+ \ifnum\LT@rows=\LTchunksize
+ \gdef\LT@setprevdepth{%
+ \prevdepth\z@\global
+ \global\let\LT@setprevdepth\relax}%
+ \expandafter\LT@xtabularcr
+ \else
+ \ifnum0=`{}\fi
+ \expandafter\LT@LL@FM@cr
+ \fi}
+\def\LT@xtabularcr{%
+ \@ifnextchar[\LT@argtabularcr\LT@ntabularcr}
+\def\LT@ntabularcr{%
+ \ifnum0=`{}\fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@argtabularcr[#1]{%
+ \ifnum0=`{}\fi
+ \ifdim #1>\z@
+ \unskip\@xargarraycr{#1}%
+ \else
+ \@yargarraycr{#1}%
+ \fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@echunk{%
+ \crcr\LT@save@row\cr\egroup
+ \global\setbox\@ne\lastbox
+ \unskip
+ \egroup}
+\def\LT@entry#1#2{%
+ \ifhmode\@firstofone{&}\fi\omit
+ \ifnum#1=\c@LT@chunks
+ \else
+ \kern#2\relax
+ \fi}
+\def\LT@entry@chop#1#2{%
+ \noexpand\LT@entry
+ {\ifnum#1>\c@LT@chunks
+ 1}{0pt%
+ \else
+ #1}{#2%
+ \fi}}
+\def\LT@entry@write{%
+ \noexpand\LT@entry^^J%
+ \@spaces}
+\def\LT@kill{%
+ \LT@echunk
+ \LT@get@widths
+ \expandafter\LT@rebox\LT@bchunk}
+\def\LT@rebox#1\bgroup{%
+ #1\bgroup
+ \unvbox\z@
+ \unskip
+ \setbox\z@\lastbox}
+\def\LT@blank@row{%
+ \xdef\LT@save@row{\expandafter\LT@build@blank
+ \romannumeral\number\LT@cols 001 }}
+\def\LT@build@blank#1{%
+ \if#1m%
+ \noexpand\LT@entry{1}{0pt}%
+ \expandafter\LT@build@blank
+ \fi}
+\def\LT@make@row{%
+ \global\expandafter\let\expandafter\LT@save@row
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ \ifx\LT@save@row\relax
+ \LT@blank@row
+ \else
+ {\let\LT@entry\or
+ \if!%
+ \ifcase\expandafter\expandafter\expandafter\LT@cols
+ \expandafter\@gobble\LT@save@row
+ \or
+ \else
+ \relax
+ \fi
+ !%
+ \else
+ \aftergroup\LT@blank@row
+ \fi}%
+ \fi}
+\let\setlongtables\relax
+\def\LT@get@widths{%
+ \setbox\tw@\hbox{%
+ \unhbox\@ne
+ \let\LT@old@row\LT@save@row
+ \global\let\LT@save@row\@empty
+ \count@\LT@cols
+ \loop
+ \unskip
+ \setbox\tw@\lastbox
+ \ifhbox\tw@
+ \LT@def@row
+ \advance\count@\m@ne
+ \repeat}%
+ \ifx\LT@@save@row\@undefined
+ \let\LT@@save@row\LT@save@row
+ \fi}
+\def\LT@def@row{%
+ \let\LT@entry\or
+ \edef\@tempa{%
+ \ifcase\expandafter\count@\LT@old@row
+ \else
+ {1}{0pt}%
+ \fi}%
+ \let\LT@entry\relax
+ \xdef\LT@save@row{%
+ \LT@entry
+ \expandafter\LT@max@sel\@tempa
+ \LT@save@row}}
+\def\LT@max@sel#1#2{%
+ {\ifdim#2=\wd\tw@
+ #1%
+ \else
+ \number\c@LT@chunks
+ \fi}%
+ {\the\wd\tw@}}
+\def\LT@hline{%
+ \noalign{\ifnum0=`}\fi
+ \penalty\@M
+ \futurelet\@let@token\LT@@hline}
+\def\LT@@hline{%
+ \ifx\@let@token\hline
+ \global\let\@gtempa\@gobble
+ \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
+ \else
+ \global\let\@gtempa\@empty
+ \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\LT@sep}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\penalty\@M}%
+ \@gtempa}
+\def\LT@caption{%
+ \noalign\bgroup
+ \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}
+\def\LT@c@ption#1[#2]#3{%
+ \LT@makecaption#1\fnum@table{#3}%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@empty\else
+ {\let\\\space
+ \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
+ \fi}
+\def\LT@capti@n{%
+ \@ifstar
+ {\egroup\LT@c@ption\@gobble[]}%
+ {\egroup\@xdblarg{\LT@c@ption\@firstofone}}}
+\def\LT@makecaption#1#2#3{%
+ \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
+ \sbox\@tempboxa{#1{#2: }#3}%
+ \ifdim\wd\@tempboxa>\hsize
+ #1{#2: }#3%
+ \else
+ \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \endgraf\vskip\baselineskip}%
+ \hss}}}
+\def\LT@output{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum\outputpenalty > -\LT@end@pen
+ \LT@err{floats and marginpars not allowed in a longtable}\@ehc
+ \else
+ \setbox\z@\vbox{\unvbox\@cclv}%
+ \ifdim \ht\LT@lastfoot>\ht\LT@foot
+ \dimen@\pagegoal
+ \advance\dimen@-\ht\LT@lastfoot
+ \ifdim\dimen@<\ht\z@
+ \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \setbox\z@\vbox{\box\LT@head}%
+ \fi
+ \fi
+ \global\@colroom\@colht
+ \global\vsize\@colht
+ \vbox
+ {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
+ \fi
+ \else
+ \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \global\vsize\@colroom
+ \copy\LT@head\nobreak
+ \fi}
+\def\LT@end@hd@ft#1{%
+ \LT@echunk
+ \ifx\LT@start\endgraf
+ \LT@err
+ {Longtable head or foot not at start of table}%
+ {Increase LTchunksize}%
+ \fi
+ \setbox#1\box\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
+\def\endhead{\LT@end@hd@ft\LT@head}
+\def\endfoot{\LT@end@hd@ft\LT@foot}
+\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}
+\def\LT@startpbox#1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \vrule \@height \ht\@arstrutbox \@width \z@}
+\def\LT@endpbox{%
+ \@finalstrut\@arstrutbox
+ \egroup
+ \the\LT@p@ftn
+ \global\LT@p@ftn{}%
+ \hfil}
+\def\LT@p@ftntext#1{%
+ \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
+ \global\LT@p@ftn\expandafter{\@tempa{#1}}}%
+
+\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen}
+\endinput
+%%
+%% End of file `longtable.sty'.
diff --git a/docs/latex/main_8cpp.tex b/docs/latex/main_8cpp.tex
new file mode 100644
index 0000000..0900b42
--- /dev/null
+++ b/docs/latex/main_8cpp.tex
@@ -0,0 +1,87 @@
+\hypertarget{main_8cpp}{}\doxysection{main.\+cpp File Reference}
+\label{main_8cpp}\index{main.cpp@{main.cpp}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$iostream$>$}\newline
+{\ttfamily \#include $<$iomanip$>$}\newline
+{\ttfamily \#include $<$memory$>$}\newline
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$cstddef$>$}\newline
+{\ttfamily \#include \char`\"{}dbc\+\_\+parser.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}dbc\+\_\+tree\+\_\+builder.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}dbc\+\_\+decode\+\_\+builder.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}dbc\+\_\+decoder.\+h\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+static void \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{Print\+Tree}} (const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$node, int indent)
+\item
+static void \mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{Print\+Decoded\+Frame}} (const \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \&decoded)
+\item
+int \mbox{\hyperlink{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}{main}} (int argc, char $\ast$argv\mbox{[}$\,$\mbox{]})
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}.
+
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}\label{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}}
+\index{main.cpp@{main.cpp}!main@{main}}
+\index{main@{main}!main.cpp@{main.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{argc, }\item[{char $\ast$}]{argv\mbox{[}$\,$\mbox{]} }\end{DoxyParamCaption})}
+
+
+
+Definition at line \mbox{\hyperlink{main_8cpp_source_l00097}{97}} of file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{Dbc\+Tree\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00024}{Raw\+Can\+Frame\+::can\+Id}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00026}{Raw\+Can\+Frame\+::data}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, \mbox{\hyperlink{decode__database_8h_source_l00133}{Decode\+Database\+::frames}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00025}{Raw\+Can\+Frame\+::is\+Extended}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Dbc\+Parser\+::\+Parse\+File()}}, \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}\label{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}}
+\index{main.cpp@{main.cpp}!PrintDecodedFrame@{PrintDecodedFrame}}
+\index{PrintDecodedFrame@{PrintDecodedFrame}!main.cpp@{main.cpp}}
+\doxysubsubsection{\texorpdfstring{PrintDecodedFrame()}{PrintDecodedFrame()}}
+{\footnotesize\ttfamily static void Print\+Decoded\+Frame (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structDecodedFrameValue}{Decoded\+Frame\+Value}} \&}]{decoded }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}}
+
+
+
+Definition at line \mbox{\hyperlink{main_8cpp_source_l00075}{75}} of file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{dbc__decoder_8h_source_l00039}{Decoded\+Signal\+Value\+::definition}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00056}{Decoded\+Frame\+Value\+::definition}}, \mbox{\hyperlink{decode__database_8h_source_l00040}{Decode\+Signal\+::name}}, \mbox{\hyperlink{decode__database_8h_source_l00073}{Decode\+Frame\+::name}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00041}{Decoded\+Signal\+Value\+::physical\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00040}{Decoded\+Signal\+Value\+::raw\+Value}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00057}{Decoded\+Frame\+Value\+::signals}}, \mbox{\hyperlink{decode__database_8h_source_l00049}{Decode\+Signal\+::unit}}, \mbox{\hyperlink{dbc__decoder_8h_source_l00042}{Decoded\+Signal\+Value\+::valid}}, and \mbox{\hyperlink{dbc__decoder_8h_source_l00058}{Decoded\+Frame\+Value\+::valid}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+\mbox{\Hypertarget{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}\label{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}}
+\index{main.cpp@{main.cpp}!PrintTree@{PrintTree}}
+\index{PrintTree@{PrintTree}!main.cpp@{main.cpp}}
+\doxysubsubsection{\texorpdfstring{PrintTree()}{PrintTree()}}
+{\footnotesize\ttfamily static void Print\+Tree (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classTreeNode}{Tree\+Node}} $\ast$}]{node, }\item[{int}]{indent }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}}
+
+
+
+Definition at line \mbox{\hyperlink{main_8cpp_source_l00023}{23}} of file \mbox{\hyperlink{main_8cpp_source}{main.\+cpp}}.
+
+
+
+References \mbox{\hyperlink{frame__info_8h_source_l00026}{Frame\+Info\+::can\+Id}}, \mbox{\hyperlink{frame__info_8h_source_l00030}{Frame\+Info\+::dlc}}, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}}, \mbox{\hyperlink{tree__node_8cpp_source_l00047}{Tree\+Node\+::\+Get\+Child()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00043}{Tree\+Node\+::\+Get\+Child\+Count()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00069}{Tree\+Node\+::\+Get\+Frame()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00065}{Tree\+Node\+::\+Get\+Name()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00073}{Tree\+Node\+::\+Get\+Signal()}}, \mbox{\hyperlink{tree__node_8cpp_source_l00061}{Tree\+Node\+::\+Get\+Type()}}, \mbox{\hyperlink{frame__info_8h_source_l00029}{Frame\+Info\+::has\+Pgn}}, \mbox{\hyperlink{frame__info_8h_source_l00027}{Frame\+Info\+::is\+Extended}}, \mbox{\hyperlink{signal__info_8h_source_l00025}{Signal\+Info\+::length}}, \mbox{\hyperlink{frame__info_8h_source_l00028}{Frame\+Info\+::pgn}}, \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}}, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}, \mbox{\hyperlink{signal__info_8h_source_l00024}{Signal\+Info\+::start\+Bit}}, and \mbox{\hyperlink{signal__info_8h_source_l00032}{Signal\+Info\+::unit}}.
+
+
+
+Referenced by \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
diff --git a/docs/latex/main_8cpp_source.tex b/docs/latex/main_8cpp_source.tex
new file mode 100644
index 0000000..a7ad458
--- /dev/null
+++ b/docs/latex/main_8cpp_source.tex
@@ -0,0 +1,141 @@
+\hypertarget{main_8cpp_source}{}\doxysection{main.\+cpp}
+\mbox{\hyperlink{main_8cpp}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00002}00002 \textcolor{comment}{ * @file main.cpp}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00013}00013 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00014}00014 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00017}00017 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00018}00018 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__parser_8h}{dbc\_parser.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00019}00019 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__tree__builder_8h}{dbc\_tree\_builder.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00020}00020 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decode__builder_8h}{dbc\_decode\_builder.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00021}00021 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{dbc__decoder_8h}{dbc\_decoder.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00022}00022 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00023}\mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{00023}} \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{PrintTree}} (\textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} *node, \textcolor{keywordtype}{int} indent) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00024}00024 \textcolor{keywordflow}{if} (node == \textcolor{keyword}{nullptr})}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00025}00025 \textcolor{keywordflow}{return};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00026}00026 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00027}00027 \textcolor{keywordflow}{for} (\textcolor{keywordtype}{int} i = 0; i < indent; ++i)}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00028}00028 std::cout << \textcolor{stringliteral}{"{} "{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00029}00029 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00030}00030 \textcolor{keywordflow}{switch} (node-\/>\mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{GetType}}()) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00031}00031 \textcolor{keywordflow}{case} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{NodeType::Root}}:}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00032}00032 std::cout << \textcolor{stringliteral}{"{}[root] "{}} << node-\/>\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}() << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00033}00033 \textcolor{keywordflow}{break};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00034}00034 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00035}00035 \textcolor{keywordflow}{case} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{NodeType::Frame}}: \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00036}00036 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *frame = node-\/>\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{GetFrame}}();}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00037}00037 std::cout << \textcolor{stringliteral}{"{}[frame] "{}} << node-\/>\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}();}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00038}00038 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00039}00039 \textcolor{keywordflow}{if} (frame != \textcolor{keyword}{nullptr}) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00040}00040 std::cout << \textcolor{stringliteral}{"{} id=0x"{}} << std::hex << frame-\/>\mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{canId}} << std::dec}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00041}00041 << \textcolor{stringliteral}{"{} ext="{}} << (frame-\/>\mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{isExtended}} ? \textcolor{stringliteral}{"{}yes"{}} : \textcolor{stringliteral}{"{}no"{}})}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00042}00042 << \textcolor{stringliteral}{"{} dlc="{}} << \textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{int}\textcolor{keyword}{>} (frame-\/>\mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}});}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00043}00043 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00044}00044 \textcolor{keywordflow}{if} (frame-\/>\mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{hasPgn}})}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00045}00045 std::cout << \textcolor{stringliteral}{"{} pgn="{}} << frame-\/>\mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00046}00046 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00047}00047 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00048}00048 std::cout << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00049}00049 \textcolor{keywordflow}{break};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00050}00050 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00051}00051 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00052}00052 \textcolor{keywordflow}{case} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{NodeType::Signal}}: \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00053}00053 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *signal = node-\/>\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{GetSignal}}();}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00054}00054 std::cout << \textcolor{stringliteral}{"{}[signal] "{}} << node-\/>\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}();}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00055}00055 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00056}00056 \textcolor{keywordflow}{if} (signal != \textcolor{keyword}{nullptr}) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00057}00057 std::cout << \textcolor{stringliteral}{"{} start="{}} << signal-\/>\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00058}00058 << \textcolor{stringliteral}{"{} len="{}} << signal-\/>\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00059}00059 << \textcolor{stringliteral}{"{} unit="{}} << signal-\/>\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00060}00060 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00061}00061 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00062}00062 std::cout << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00063}00063 \textcolor{keywordflow}{break};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00064}00064 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00065}00065 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00066}00066 \textcolor{keywordflow}{default}:}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00067}00067 std::cout << \textcolor{stringliteral}{"{}[unknown]\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00068}00068 \textcolor{keywordflow}{break};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00069}00069 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00070}00070 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00071}00071 \textcolor{keywordflow}{for} (std::size\_t i = 0U; i < node-\/>\mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{GetChildCount}}(); ++i)}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00072}00072 \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{PrintTree}} (node-\/>\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{GetChild}} (i), indent + 1);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00073}00073 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00074}00074 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00075}\mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{00075}} \textcolor{keyword}{static} \textcolor{keywordtype}{void} \mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{PrintDecodedFrame}} (\textcolor{keyword}{const} \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} \&decoded) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00076}00076 \textcolor{keywordflow}{if} (!decoded.\mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}} || (decoded.\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}} == \textcolor{keyword}{nullptr})) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00077}00077 std::cout << \textcolor{stringliteral}{"{}No frame definition found.\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00078}00078 \textcolor{keywordflow}{return};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00079}00079 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00080}00080 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00081}00081 std::cout << \textcolor{stringliteral}{"{}Decoded frame: "{}} << decoded.\mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}}-\/>\mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}} << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00082}00082 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00083}00083 \textcolor{keywordflow}{for} (std::size\_t index = 0U; index < decoded.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}.size(); ++index) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00084}00084 \textcolor{keyword}{const} \mbox{\hyperlink{structDecodedSignalValue}{DecodedSignalValue}} \&signal = decoded.\mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}[index];}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00085}00085 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00086}00086 \textcolor{keywordflow}{if} ((signal.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}} == \textcolor{keyword}{nullptr}) || !signal.\mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}})}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00087}00087 \textcolor{keywordflow}{continue};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00088}00088 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00089}00089 std::cout << \textcolor{stringliteral}{"{} "{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}-\/>\mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00090}00090 << \textcolor{stringliteral}{"{} raw="{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{rawValue}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00091}00091 << \textcolor{stringliteral}{"{} physical="{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physicalValue}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00092}00092 << \textcolor{stringliteral}{"{} "{}} << signal.\mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}-\/>\mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00093}00093 << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00094}00094 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00095}00095 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00096}00096 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00097}\mbox{\hyperlink{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}{00097}} \textcolor{keywordtype}{int} \mbox{\hyperlink{main_8cpp_a0ddf1224851353fc92bfbff6f499fa97}{main}} (\textcolor{keywordtype}{int} argc, \textcolor{keywordtype}{char} *argv[]) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00098}00098 \textcolor{keywordflow}{if} (argc < 2) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00099}00099 std::cerr << \textcolor{stringliteral}{"{}Usage: dbc\_demo \(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00100}00100 \textcolor{keywordflow}{return} 1;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00101}00101 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00102}00102 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00103}00103 \textcolor{keywordflow}{try} \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00104}00104 \mbox{\hyperlink{classDbcParser}{DbcParser}} parser;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00105}00105 \mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} database = parser.\mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{ParseFile}} (argv[1]);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00106}00106 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00107}00107 \mbox{\hyperlink{classDbcTreeBuilder}{DbcTreeBuilder}} treeBuilder;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00108}00108 std::unique\_ptr root = treeBuilder.\mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}} (database);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00109}00109 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00110}00110 std::cout << \textcolor{stringliteral}{"{}=== Parsed tree ===\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00111}00111 \mbox{\hyperlink{main_8cpp_a57aefef9cfd52a8190df002e12808e0a}{PrintTree}} (root.get(), 0);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00112}00112 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00113}00113 \mbox{\hyperlink{classDbcDecodeBuilder}{DbcDecodeBuilder}} decodeBuilder;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00114}00114 \mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} decodeDatabase = decodeBuilder.\mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}} (database);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00115}00115 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00116}00116 \textcolor{comment}{/*}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00117}00117 \textcolor{comment}{ * Example raw frame.}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00118}00118 \textcolor{comment}{ * Replace with live CAN frame or trace record later.}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00119}00119 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00120}00120 \mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} rawFrame;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00121}00121 rawFrame.\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}} = decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.empty() ? 0U : decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}[0].canId;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00122}00122 rawFrame.\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}} = decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}.empty() ? false : decodeDatabase.\mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}[0].isExtended;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00123}00123 rawFrame.\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}.resize (8U, 0U);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00124}00124 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00125}00125 \mbox{\hyperlink{classDbcDecoder}{DbcDecoder}} decoder;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00126}00126 \mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} decoded = decoder.\mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}} (decodeDatabase, rawFrame);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00127}00127 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00128}00128 std::cout << \textcolor{stringliteral}{"{}\(\backslash\)n=== Decoded frame ===\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00129}00129 \mbox{\hyperlink{main_8cpp_a26dbbea5b56e3fbc451b68f217d5063f}{PrintDecodedFrame}} (decoded);}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00130}00130 \} \textcolor{keywordflow}{catch} (\textcolor{keyword}{const} std::exception \&ex) \{}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00131}00131 std::cerr << \textcolor{stringliteral}{"{}Error: "{}} << ex.what() << \textcolor{stringliteral}{"{}\(\backslash\)n"{}};}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00132}00132 \textcolor{keywordflow}{return} 2;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00133}00133 \}}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00134}00134 }
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00135}00135 \textcolor{keywordflow}{return} 0;}
+\DoxyCodeLine{\Hypertarget{main_8cpp_source_l00136}00136 \}}
+
+\end{DoxyCode}
diff --git a/docs/latex/md_README.tex b/docs/latex/md_README.tex
new file mode 100644
index 0000000..7311a11
--- /dev/null
+++ b/docs/latex/md_README.tex
@@ -0,0 +1,914 @@
+\hypertarget{md_README_autotoc_md1}{}\doxysection{Overview}\label{md_README_autotoc_md1}
+This module provides a minimal but extensible DBC parser and runtime decode foundation for the {\bfseries{Frame\+Tap}} project.
+
+Its purpose is to\+:
+
+
+\begin{DoxyItemize}
+\item parse DBC files
+\item store parsed frame and signal metadata
+\item build a tree for future UI integration
+\item build a runtime-\/ready decode database
+\item decode live CAN frames
+\item decode CAN trace records using the same decoder
+\end{DoxyItemize}
+
+The implementation follows a simple and practical design\+:
+
+
+\begin{DoxyItemize}
+\item parser logic is separated from UI logic
+\item runtime decode structures are separated from tree structures
+\item Qt is not required at the parser or decoder level
+\item the same decode engine can be reused for live traffic and trace replay
+\end{DoxyItemize}
+
+This is {\bfseries{not a full production-\/grade DBC implementation yet}}, but it is a strong architectural base.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md3}{}\doxysection{High-\/\+Level Architecture}\label{md_README_autotoc_md3}
+The module is divided into two main paths.\hypertarget{md_README_autotoc_md4}{}\doxysubsection{1. Parse and UI path}\label{md_README_autotoc_md4}
+Used for\+:
+
+
+\begin{DoxyItemize}
+\item browsing frames and signals
+\item later integration with Qt {\ttfamily Model/\+View}
+\item displaying metadata
+\end{DoxyItemize}
+
+Pipeline\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{DBC file}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcParser}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcDatabase}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcTreeBuilder}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{TreeNode hierarchy}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{future Qt UI}
+
+\end{DoxyCode}
+\hypertarget{md_README_autotoc_md5}{}\doxysubsection{2. Runtime decode path}\label{md_README_autotoc_md5}
+Used for\+:
+
+
+\begin{DoxyItemize}
+\item live CAN decoding
+\item CAN trace decoding
+\item fast lookup by CAN ID
+\end{DoxyItemize}
+
+Pipeline\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{DBC file}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcParser}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcDatabase}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcDecodeBuilder}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DecodeDatabase}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcDecoder}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{Decoded values}
+
+\end{DoxyCode}
+
+
+This separation is intentional.
+
+The tree is useful for UI, but it is {\bfseries{not}} the main data structure for runtime decoding.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md7}{}\doxysection{Why the Runtime Decode Layer Exists}\label{md_README_autotoc_md7}
+A tree structure is convenient for browsing, but a runtime decoder needs something different\+:
+
+
+\begin{DoxyItemize}
+\item fast lookup by CAN ID
+\item direct access to signal decode definitions
+\item minimal overhead during repeated decoding
+\item the same logic for live frames and trace frames
+\end{DoxyItemize}
+
+Because of that, the design uses a dedicated runtime-\/ready structure\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}}
+\item {\ttfamily \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}}
+\item {\ttfamily \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}}
+\end{DoxyItemize}
+
+This avoids forcing UI-\/oriented structures into a decode role they were not meant for.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md9}{}\doxysection{Module Layout}\label{md_README_autotoc_md9}
+\hypertarget{md_README_autotoc_md10}{}\doxysubsection{Parsed DBC structures}\label{md_README_autotoc_md10}
+Files\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{signal__info_8h}{signal\+\_\+info.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{frame__info_8h}{frame\+\_\+info.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__database_8h}{dbc\+\_\+database.\+h}}}
+\end{DoxyItemize}
+
+These store a readable representation of the parsed DBC file.\hypertarget{md_README_autotoc_md11}{}\doxysubsection{UI tree structures}\label{md_README_autotoc_md11}
+Files\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{tree__node_8h}{tree\+\_\+node.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{tree__node_8cpp}{tree\+\_\+node.\+cpp}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__tree__builder_8h}{dbc\+\_\+tree\+\_\+builder.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__tree__builder_8cpp}{dbc\+\_\+tree\+\_\+builder.\+cpp}}}
+\end{DoxyItemize}
+
+These convert parsed DBC content into a tree hierarchy suitable for UI and model/view usage later.\hypertarget{md_README_autotoc_md12}{}\doxysubsection{Runtime decode structures}\label{md_README_autotoc_md12}
+Files\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__decode__builder_8h}{dbc\+\_\+decode\+\_\+builder.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__decode__builder_8cpp}{dbc\+\_\+decode\+\_\+builder.\+cpp}}}
+\end{DoxyItemize}
+
+These convert parsed DBC content into a structure optimized for decoding.\hypertarget{md_README_autotoc_md13}{}\doxysubsection{Runtime decoder}\label{md_README_autotoc_md13}
+Files\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__decoder_8cpp}{dbc\+\_\+decoder.\+cpp}}}
+\end{DoxyItemize}
+
+These perform actual decoding of raw CAN frames using {\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}}.\hypertarget{md_README_autotoc_md14}{}\doxysubsection{Parser}\label{md_README_autotoc_md14}
+Files\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{dbc__parser_8h}{dbc\+\_\+parser.\+h}}}
+\item {\ttfamily \mbox{\hyperlink{dbc__parser_8cpp}{dbc\+\_\+parser.\+cpp}}}
+\end{DoxyItemize}
+
+These parse the DBC file itself.\hypertarget{md_README_autotoc_md15}{}\doxysubsection{Demo}\label{md_README_autotoc_md15}
+File\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{main_8cpp}{main.\+cpp}}}
+\end{DoxyItemize}
+
+Used as a small integration example.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md17}{}\doxysection{Parsed Data Structures}\label{md_README_autotoc_md17}
+\hypertarget{md_README_autotoc_md18}{}\doxysection{$<$tt$>$\+Signal\+Info$<$/tt$>$}\label{md_README_autotoc_md18}
+Represents one signal as parsed from the DBC file.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily name}
+\item {\ttfamily start\+Bit}
+\item {\ttfamily length}
+\item {\ttfamily is\+Little\+Endian}
+\item {\ttfamily is\+Signed}
+\item {\ttfamily factor}
+\item {\ttfamily offset}
+\item {\ttfamily minimum}
+\item {\ttfamily maximum}
+\item {\ttfamily unit}
+\item {\ttfamily receivers}
+\item {\ttfamily comment}
+\end{DoxyItemize}
+
+Notes\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily receivers} is a list because a signal may have more than one receiver ECU
+\item {\ttfamily factor} and {\ttfamily offset} define physical conversion
+\item this structure is close to DBC content and easy to inspect
+\end{DoxyItemize}
+
+Physical value rule\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{physical = raw * factor + offset}
+
+\end{DoxyCode}
+
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md20}{}\doxysection{$<$tt$>$\+Frame\+Info$<$/tt$>$}\label{md_README_autotoc_md20}
+Represents one frame as parsed from the DBC file.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily name}
+\item {\ttfamily can\+Id}
+\item {\ttfamily is\+Extended}
+\item {\ttfamily pgn}
+\item {\ttfamily has\+Pgn}
+\item {\ttfamily dlc}
+\item {\ttfamily transmitter}
+\item {\ttfamily comment}
+\item {\ttfamily signals}
+\end{DoxyItemize}
+
+Notes\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily signals} is a list of {\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}}}
+\item {\ttfamily is\+Extended} is determined during CAN ID normalization
+\item {\ttfamily pgn} is derived using simplified J1939 logic when applicable
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md22}{}\doxysection{$<$tt$>$\+Dbc\+Database$<$/tt$>$}\label{md_README_autotoc_md22}
+Top-\/level parsed DBC container.
+
+Conceptually\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{DbcDatabase}
+\DoxyCodeLine{ └── vector}
+
+\end{DoxyCode}
+
+
+This is the central structure produced by {\ttfamily \mbox{\hyperlink{classDbcParser}{Dbc\+Parser}}}.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md24}{}\doxysection{UI Tree Layer}\label{md_README_autotoc_md24}
+\hypertarget{md_README_autotoc_md25}{}\doxysection{$<$tt$>$\+Tree\+Node$<$/tt$>$}\label{md_README_autotoc_md25}
+The UI tree contains three node types\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily Root}
+\item {\ttfamily Frame}
+\item {\ttfamily Signal}
+\end{DoxyItemize}
+
+Example hierarchy\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{dbc}
+\DoxyCodeLine{ ├── EngineData}
+\DoxyCodeLine{ │ ├── EngineSpeed}
+\DoxyCodeLine{ │ ├── OilTemp}
+\DoxyCodeLine{ │ └── CoolantTemp}
+\DoxyCodeLine{ └── VehicleData}
+\DoxyCodeLine{ ├── VehicleSpeed}
+\DoxyCodeLine{ └── Odometer}
+
+\end{DoxyCode}
+
+
+Each node stores either\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{structFrameInfo}{Frame\+Info}}}
+\item {\ttfamily \mbox{\hyperlink{structSignalInfo}{Signal\+Info}}}
+\end{DoxyItemize}
+
+The tree is intended for browsing and later Qt model integration.
+
+It is {\bfseries{not}} the primary runtime decode structure.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md27}{}\doxysection{Runtime Decode Layer}\label{md_README_autotoc_md27}
+\hypertarget{md_README_autotoc_md28}{}\doxysection{Purpose}\label{md_README_autotoc_md28}
+The decode layer exists so that decoding can be fast and independent from UI concerns.
+
+Instead of searching a tree, the decoder uses a prepared database with direct lookup.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md30}{}\doxysection{$<$tt$>$\+Byte\+Order$<$/tt$>$}\label{md_README_autotoc_md30}
+Runtime byte order enum\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily Intel}
+\item {\ttfamily Motorola}
+\end{DoxyItemize}
+
+This is better for decode code than passing around raw DBC characters.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md32}{}\doxysection{$<$tt$>$\+Value\+Type$<$/tt$>$}\label{md_README_autotoc_md32}
+Numeric type enum\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily Unsigned}
+\item {\ttfamily Signed}
+\end{DoxyItemize}
+
+This is clearer than combining multiple boolean flags during runtime logic.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md34}{}\doxysection{$<$tt$>$\+Decode\+Signal$<$/tt$>$}\label{md_README_autotoc_md34}
+Represents one runtime-\/ready signal definition.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily name}
+\item {\ttfamily start\+Bit}
+\item {\ttfamily length}
+\item {\ttfamily byte\+Order}
+\item {\ttfamily value\+Type}
+\item {\ttfamily factor}
+\item {\ttfamily offset}
+\item {\ttfamily minimum}
+\item {\ttfamily maximum}
+\item {\ttfamily unit}
+\item {\ttfamily receivers}
+\item {\ttfamily comment}
+\end{DoxyItemize}
+
+This structure contains all information required for extracting and converting a signal value from raw frame data.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md36}{}\doxysection{$<$tt$>$\+Decode\+Frame$<$/tt$>$}\label{md_README_autotoc_md36}
+Represents one runtime-\/ready frame definition.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily name}
+\item {\ttfamily can\+Id}
+\item {\ttfamily is\+Extended}
+\item {\ttfamily dlc}
+\item {\ttfamily pgn}
+\item {\ttfamily has\+Pgn}
+\item {\ttfamily transmitter}
+\item {\ttfamily comment}
+\item {\ttfamily signals}
+\end{DoxyItemize}
+
+This structure is used directly by the decoder.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md38}{}\doxysection{$<$tt$>$\+Frame\+Key$<$/tt$>$}\label{md_README_autotoc_md38}
+Fast lookup key for runtime frame matching.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily can\+Id}
+\item {\ttfamily is\+Extended}
+\end{DoxyItemize}
+
+This matters because the same numeric identifier must not be confused between standard and extended frames.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md40}{}\doxysection{$<$tt$>$\+Decode\+Database$<$/tt$>$}\label{md_README_autotoc_md40}
+Top-\/level runtime decode container.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily frames}
+\item {\ttfamily frame\+Index\+By\+Key}
+\end{DoxyItemize}
+
+Conceptually\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{DecodeDatabase}
+\DoxyCodeLine{ ├── vector}
+\DoxyCodeLine{ └── unordered\_map}
+
+\end{DoxyCode}
+
+
+This gives the decoder fast access to a frame definition using CAN ID and frame type.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md42}{}\doxysection{Decoder Layer}\label{md_README_autotoc_md42}
+\hypertarget{md_README_autotoc_md43}{}\doxysection{$<$tt$>$\+Raw\+Can\+Frame$<$/tt$>$}\label{md_README_autotoc_md43}
+Represents a raw CAN frame to decode.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily can\+Id}
+\item {\ttfamily is\+Extended}
+\item {\ttfamily data}
+\end{DoxyItemize}
+
+This same structure can be used for\+:
+
+
+\begin{DoxyItemize}
+\item live CAN bus input
+\item replayed trace records
+\item unit tests
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md45}{}\doxysection{$<$tt$>$\+Decoded\+Signal\+Value$<$/tt$>$}\label{md_README_autotoc_md45}
+Represents one decoded signal result.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily definition}
+\item {\ttfamily raw\+Value}
+\item {\ttfamily physical\+Value}
+\item {\ttfamily valid}
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md47}{}\doxysection{$<$tt$>$\+Decoded\+Frame\+Value$<$/tt$>$}\label{md_README_autotoc_md47}
+Represents one decoded frame result.
+
+Fields\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily definition}
+\item {\ttfamily signals}
+\item {\ttfamily valid}
+\end{DoxyItemize}
+
+This is the decoder output for one raw frame.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md49}{}\doxysection{$<$tt$>$\+Dbc\+Decoder$<$/tt$>$}\label{md_README_autotoc_md49}
+Main runtime decoder class.
+
+Responsibilities\+:
+
+
+\begin{DoxyItemize}
+\item find a frame definition by CAN ID
+\item decode all signals in a frame
+\item extract raw values
+\item sign-\/extend signed values
+\item convert raw values into physical values
+\end{DoxyItemize}
+
+Main methods\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily Find\+Frame(...)}
+\item {\ttfamily Decode(...)}
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md51}{}\doxysection{Parser Support}\label{md_README_autotoc_md51}
+The current parser supports the following DBC elements\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily BO\+\_\+}
+\item {\ttfamily SG\+\_\+}
+\item {\ttfamily CM\+\_\+ BO\+\_\+}
+\item {\ttfamily CM\+\_\+ SG\+\_\+}
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md53}{}\doxysection{Supported DBC Syntax}\label{md_README_autotoc_md53}
+\hypertarget{md_README_autotoc_md54}{}\doxysection{Frame definition}\label{md_README_autotoc_md54}
+Example\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{BO\_ 256 EngineData: 8 EEC1}
+
+\end{DoxyCode}
+
+
+Parsed fields\+:
+
+
+\begin{DoxyItemize}
+\item frame CAN ID
+\item frame name
+\item DLC
+\item transmitter ECU
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md56}{}\doxysection{Signal definition}\label{md_README_autotoc_md56}
+Example\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{SG\_ EngineSpeed : 0|16@1+ (0.125,0) [0|8000] "{}rpm"{} ECU1,ECU2}
+
+\end{DoxyCode}
+
+
+Parsed fields\+:
+
+
+\begin{DoxyItemize}
+\item signal name
+\item start bit
+\item signal length
+\item byte order
+\item signedness
+\item factor
+\item offset
+\item minimum
+\item maximum
+\item unit
+\item receivers
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md58}{}\doxysection{Comments}\label{md_README_autotoc_md58}
+Frame comment example\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{CM\_ BO\_ 256 "{}Engine data frame"{};}
+
+\end{DoxyCode}
+
+
+Signal comment example\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{CM\_ SG\_ 256 EngineSpeed "{}Actual engine speed"{};}
+
+\end{DoxyCode}
+
+
+Stored in\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{Frame\+Info\+::comment}}}
+\item {\ttfamily \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{Signal\+Info\+::comment}}}
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md60}{}\doxysection{CAN ID Normalization}\label{md_README_autotoc_md60}
+The parser normalizes frame identifiers.
+
+Common DBC behavior\+:
+
+
+\begin{DoxyItemize}
+\item extended identifiers may be stored with bit 31 set
+\item the actual 29-\/bit identifier must be extracted from that value
+\end{DoxyItemize}
+
+The parser therefore stores\+:
+
+
+\begin{DoxyItemize}
+\item normalized {\ttfamily can\+Id}
+\item separate {\ttfamily is\+Extended} flag
+\end{DoxyItemize}
+
+This is important both for correct lookup and for future interoperability with live CAN APIs.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md62}{}\doxysection{PGN Extraction}\label{md_README_autotoc_md62}
+PGN is derived only when the frame is treated as extended.
+
+The current logic is simplified J1939 extraction\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily pf}
+\item {\ttfamily ps}
+\item {\ttfamily dp}
+\end{DoxyItemize}
+
+This is enough for a practical start but should not be treated as full J1939 validation.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md64}{}\doxysection{Decode Flow}\label{md_README_autotoc_md64}
+Typical runtime decode flow\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{RawCanFrame}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{Find frame in DecodeDatabase}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{For each signal:}
+\DoxyCodeLine{ extract raw bits}
+\DoxyCodeLine{ apply sign extension if needed}
+\DoxyCodeLine{ convert to physical value}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DecodedFrameValue}
+
+\end{DoxyCode}
+
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md66}{}\doxysection{Intel and Motorola Extraction}\label{md_README_autotoc_md66}
+The decoder currently has separate extraction paths\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily Extract\+Intel(...)}
+\item {\ttfamily Extract\+Motorola(...)}
+\end{DoxyItemize}
+
+This is important because byte order is not just metadata once decoding starts.
+
+Intel and Motorola require different bit extraction logic.
+
+This is one of the main reasons why the runtime decode layer should be explicit and prepared in advance.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md68}{}\doxysection{Example Usage}\label{md_README_autotoc_md68}
+\hypertarget{md_README_autotoc_md69}{}\doxysection{Parse DBC}\label{md_README_autotoc_md69}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\mbox{\hyperlink{classDbcParser}{DbcParser}} parser;}
+\DoxyCodeLine{\mbox{\hyperlink{structDbcDatabase}{DbcDatabase}} database = parser.\mbox{\hyperlink{classDbcParser_aef72826942c9095d653fafa435855e56}{ParseFile}}(\textcolor{stringliteral}{"{}example.dbc"{}});}
+
+\end{DoxyCode}
+\hypertarget{md_README_autotoc_md70}{}\doxysection{Build UI tree}\label{md_README_autotoc_md70}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\mbox{\hyperlink{classDbcTreeBuilder}{DbcTreeBuilder}} treeBuilder;}
+\DoxyCodeLine{std::unique\_ptr root = treeBuilder.\mbox{\hyperlink{classDbcTreeBuilder_a7e57d067d831b14b383947fd125edd4b}{Build}}(database);}
+
+\end{DoxyCode}
+\hypertarget{md_README_autotoc_md71}{}\doxysection{Build runtime decode database}\label{md_README_autotoc_md71}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\mbox{\hyperlink{classDbcDecodeBuilder}{DbcDecodeBuilder}} decodeBuilder;}
+\DoxyCodeLine{\mbox{\hyperlink{structDecodeDatabase}{DecodeDatabase}} decodeDatabase = decodeBuilder.\mbox{\hyperlink{classDbcDecodeBuilder_a2bc6386dfb5e58976c42e22c19ec471b}{Build}}(database);}
+
+\end{DoxyCode}
+\hypertarget{md_README_autotoc_md72}{}\doxysection{Decode a raw frame}\label{md_README_autotoc_md72}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\mbox{\hyperlink{structRawCanFrame}{RawCanFrame}} rawFrame;}
+\DoxyCodeLine{rawFrame.\mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{canId}} = 0x123;}
+\DoxyCodeLine{rawFrame.\mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{isExtended}} = \textcolor{keyword}{false};}
+\DoxyCodeLine{rawFrame.\mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}} = \{0x01, 0x02, 0x03, 0x04\};}
+\DoxyCodeLine{}
+\DoxyCodeLine{\mbox{\hyperlink{classDbcDecoder}{DbcDecoder}} decoder;}
+\DoxyCodeLine{\mbox{\hyperlink{structDecodedFrameValue}{DecodedFrameValue}} decoded = decoder.\mbox{\hyperlink{classDbcDecoder_a345951ffe5d943a70d3a1ea1f39e74f7}{Decode}}(decodeDatabase, rawFrame);}
+
+\end{DoxyCode}
+
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md74}{}\doxysection{Unified Decode Strategy}\label{md_README_autotoc_md74}
+A key design goal is that the same decoder should work for both\+:
+
+
+\begin{DoxyItemize}
+\item live CAN frames
+\item trace replay frames
+\end{DoxyItemize}
+
+That means this architecture supports\+:\hypertarget{md_README_autotoc_md75}{}\doxysubsection{live path}\label{md_README_autotoc_md75}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{live CAN input}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{RawCanFrame}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcDecoder}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{decoded signal values}
+
+\end{DoxyCode}
+\hypertarget{md_README_autotoc_md76}{}\doxysubsection{trace path}\label{md_README_autotoc_md76}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{trace reader}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{RawCanFrame}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{DbcDecoder}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{decoded signal values}
+
+\end{DoxyCode}
+
+
+This avoids duplicating decode logic in two separate parts of the application.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md78}{}\doxysection{Intended Use in Frame\+Tap}\label{md_README_autotoc_md78}
+This module is meant to support at least the following Frame\+Tap workflows\+:
+
+
+\begin{DoxyItemize}
+\item load a DBC file
+\item browse frames and signals
+\item search signals
+\item drag a signal into a plot later
+\item decode live CAN traffic
+\item decode recorded traces
+\item convert raw values into physical values
+\item show metadata like units, comments, transmitter, receivers, and PGN
+\end{DoxyItemize}
+
+Example combined workflow\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{Load DBC}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{Parse into DbcDatabase}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{Build UI tree}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{Build DecodeDatabase}
+\DoxyCodeLine{ ↓}
+\DoxyCodeLine{Use same decode engine for:}
+\DoxyCodeLine{ -\/ live frames}
+\DoxyCodeLine{ -\/ trace replay}
+
+\end{DoxyCode}
+
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md80}{}\doxysection{Why the Tree Is Not Enough}\label{md_README_autotoc_md80}
+The tree exists for browsing.
+
+However, runtime decode should not rely on tree traversal because that would introduce unnecessary coupling and inefficiency.
+
+A runtime decoder needs\+:
+
+
+\begin{DoxyItemize}
+\item fast key-\/based access
+\item minimal interpretation at decode time
+\item direct signal definitions already prepared
+\end{DoxyItemize}
+
+That is why {\ttfamily \mbox{\hyperlink{structDecodeDatabase}{Decode\+Database}}} is a separate layer.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md82}{}\doxysection{Why No Abstract Factory Is Used}\label{md_README_autotoc_md82}
+At the current stage, abstract factory is intentionally avoided.
+
+The current design is already clean\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{parser → parsed database → decode database}
+\DoxyCodeLine{ ↘ tree builder → UI tree}
+
+\end{DoxyCode}
+
+
+Introducing factory layers now would increase complexity without solving an immediate problem.
+
+If later the project requires multiple output representations or multiple build strategies, that can be added then.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md84}{}\doxysection{Current Limitations}\label{md_README_autotoc_md84}
+This is still a minimal implementation.
+
+Not supported yet\+:
+
+
+\begin{DoxyItemize}
+\item multiplexed signals
+\item {\ttfamily VAL\+\_\+} tables
+\item {\ttfamily BA\+\_\+} attributes
+\item {\ttfamily BA\+\_\+\+DEF\+\_\+} definitions
+\item advanced comment handling
+\item full DBC grammar coverage
+\item full J1939 validation
+\item extensive edge-\/case handling for unusual DBC formatting
+\end{DoxyItemize}
+
+Motorola extraction is implemented, but it should still be verified carefully against real-\/world DBC files and expected values.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md86}{}\doxysection{Recommended Next Steps}\label{md_README_autotoc_md86}
+A practical development order would be\+:\hypertarget{md_README_autotoc_md87}{}\doxysubsection{Stage 1 -\/ already implemented}\label{md_README_autotoc_md87}
+
+\begin{DoxyItemize}
+\item {\ttfamily BO\+\_\+}
+\item {\ttfamily SG\+\_\+}
+\item {\ttfamily CM\+\_\+}
+\item normalized CAN ID
+\item {\ttfamily is\+Extended}
+\item transmitter
+\item receivers
+\item comments
+\item tree representation
+\item runtime decode database
+\item runtime decoder
+\end{DoxyItemize}\hypertarget{md_README_autotoc_md88}{}\doxysubsection{Stage 2}\label{md_README_autotoc_md88}
+Recommended additions\+:
+
+
+\begin{DoxyItemize}
+\item parent pointer in {\ttfamily \mbox{\hyperlink{classTreeNode}{Tree\+Node}}}
+\item Qt model adapter
+\item {\ttfamily VAL\+\_\+} support for enum-\/style signals
+\item better display strings for UI
+\item selective decoding of only chosen signals
+\end{DoxyItemize}\hypertarget{md_README_autotoc_md89}{}\doxysubsection{Stage 3}\label{md_README_autotoc_md89}
+Recommended additions\+:
+
+
+\begin{DoxyItemize}
+\item multiplexing support
+\item attribute parsing
+\item richer J1939 support
+\item CSV export of decoded traces
+\item optimized filtering and signal selection
+\end{DoxyItemize}\hypertarget{md_README_autotoc_md90}{}\doxysubsection{Stage 4}\label{md_README_autotoc_md90}
+Advanced functionality\+:
+
+
+\begin{DoxyItemize}
+\item live plot integration
+\item signal subscriptions
+\item per-\/signal trace decode pipelines
+\item decoder-\/assisted export formats
+\end{DoxyItemize}
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md92}{}\doxysection{Build Integration}\label{md_README_autotoc_md92}
+The module does not depend on any specific build system.
+
+It can be integrated with\+:
+
+
+\begin{DoxyItemize}
+\item CMake
+\item qmake
+\item Makefile
+\end{DoxyItemize}
+
+Just add the source files to the project.
+
+\DoxyHorRuler{0}
+\hypertarget{md_README_autotoc_md94}{}\doxysection{Summary}\label{md_README_autotoc_md94}
+This module is now split into two intentionally separate layers\+:\hypertarget{md_README_autotoc_md95}{}\doxysubsection{Parsed representation}\label{md_README_autotoc_md95}
+Used for\+:
+
+
+\begin{DoxyItemize}
+\item storing parsed DBC content
+\item browsing
+\item UI tree generation
+\end{DoxyItemize}\hypertarget{md_README_autotoc_md96}{}\doxysubsection{Runtime decode representation}\label{md_README_autotoc_md96}
+Used for\+:
+
+
+\begin{DoxyItemize}
+\item fast frame lookup
+\item live CAN decode
+\item trace decode
+\item physical value conversion
+\end{DoxyItemize}
+
+That separation is the main architectural improvement.
+
+In short, the system now looks like this\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{DBC parser → DbcDatabase → DecodeDatabase → DbcDecoder}
+\DoxyCodeLine{ ↘ TreeNode → future UI}
+
+\end{DoxyCode}
+
+
+This gives Frame\+Tap a much better foundation for real use, because both browsing and decoding are supported without forcing one representation to do the other\textquotesingle{}s job.
\ No newline at end of file
diff --git a/docs/latex/namespaceanonymous__namespace_02dbc__parser_8cpp_03.tex b/docs/latex/namespaceanonymous__namespace_02dbc__parser_8cpp_03.tex
new file mode 100644
index 0000000..417b9f5
--- /dev/null
+++ b/docs/latex/namespaceanonymous__namespace_02dbc__parser_8cpp_03.tex
@@ -0,0 +1,36 @@
+\hypertarget{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{}\doxysection{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\} Namespace Reference}
+\label{namespaceanonymous__namespace_02dbc__parser_8cpp_03}\index{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}@{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+std\+::string \mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}{Trim\+Text}} (const std\+::string \&text)
+\begin{DoxyCompactList}\small\item\em Remove leading and trailing spaces. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}\label{namespaceanonymous__namespace_02dbc__parser_8cpp_03_a5850f07ce5f4e5c4f3bf385ebcfcebbb}}
+\index{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}@{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}}!TrimText@{TrimText}}
+\index{TrimText@{TrimText}!anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}@{anonymous\_namespace\lcurly{}dbc\_parser.cpp\rcurly{}}}
+\doxysubsubsection{\texorpdfstring{TrimText()}{TrimText()}}
+{\footnotesize\ttfamily std\+::string anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}\+::\+Trim\+Text (\begin{DoxyParamCaption}\item[{const std\+::string \&}]{text }\end{DoxyParamCaption})}
+
+
+
+Remove leading and trailing spaces.
+
+
+\begin{DoxyParams}{Parameters}
+{\em text} & Input text. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Trimmed text.
+\end{DoxyReturn}
+
+
+Definition at line \mbox{\hyperlink{dbc__parser_8cpp_source_l00025}{25}} of file \mbox{\hyperlink{dbc__parser_8cpp_source}{dbc\+\_\+parser.\+cpp}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00087}{Dbc\+Parser\+::\+Split\+Receivers()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00083}{Dbc\+Parser\+::\+Trim()}}.
+
diff --git a/docs/latex/namespaces.tex b/docs/latex/namespaces.tex
new file mode 100644
index 0000000..7d6b055
--- /dev/null
+++ b/docs/latex/namespaces.tex
@@ -0,0 +1,4 @@
+\doxysection{Namespace List}
+Here is a list of all namespaces with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{namespaceanonymous__namespace_02dbc__parser_8cpp_03}{anonymous\+\_\+namespace\{dbc\+\_\+parser.\+cpp\}}} }{\pageref{namespaceanonymous__namespace_02dbc__parser_8cpp_03}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/refman.tex b/docs/latex/refman.tex
new file mode 100644
index 0000000..b273085
--- /dev/null
+++ b/docs/latex/refman.tex
@@ -0,0 +1,248 @@
+ % Handle batch mode
+ % to overcome problems with too many open files
+ \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage}
+ % Set document class depending on configuration
+ \documentclass[twoside]{book}
+ %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package
+ \usepackage{ifthen}
+ \ifx\requestedLaTeXdate\undefined
+ \usepackage{array}
+ \else
+ \usepackage{array}[=2016-10-06]
+ \fi
+ %%
+ % Packages required by doxygen
+ \usepackage{fixltx2e} % for \textsubscript
+ \usepackage{doxygen}
+ \usepackage{graphicx}
+ \usepackage[utf8]{inputenc}
+ \usepackage{makeidx}
+ \PassOptionsToPackage{warn}{textcomp}
+ \usepackage{textcomp}
+ \usepackage[nointegrals]{wasysym}
+ \usepackage{ifxetex}
+ % NLS support packages
+ % Define default fonts
+ % Font selection
+ \usepackage[T1]{fontenc}
+ % set main and monospaced font
+ \usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\renewcommand{\familydefault}{\sfdefault}
+ \usepackage{sectsty}
+ \allsectionsfont{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \renewcommand{\DoxyLabelFont}{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+ % Arguments of doxygenemoji:
+ % 1) '::' form of the emoji, already LaTeX-escaped
+ % 2) file with the name of the emoji without the .png extension
+ % in case image exist use this otherwise use the '::' form
+ \newcommand{\doxygenemoji}[2]{%
+ \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}%
+ }
+ % Page & text layout
+ \usepackage{geometry}
+ \geometry{%
+ letterpaper,%
+ top=2.5cm,%
+ bottom=2.5cm,%
+ left=2.5cm,%
+ right=2.5cm%
+ }
+ % Allow a bit of overflow to go unnoticed by other means
+ \tolerance=750
+ \hfuzz=15pt
+ \hbadness=750
+ \setlength{\emergencystretch}{15pt}
+ \setlength{\parindent}{0cm}
+ \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}}
+ \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}}
+ \doxynormalparskip
+ % Redefine paragraph/subparagraph environments, using sectsty fonts
+ \makeatletter
+ \renewcommand{\paragraph}{%
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@parafont%
+ }%
+ }
+ \renewcommand{\subparagraph}{%
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@subparafont%
+ }%
+ }
+ \makeatother
+ \makeatletter
+ \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@}
+ \makeatother
+ % Headers & footers
+ \usepackage{fancyhdr}
+ \pagestyle{fancyplain}
+ \renewcommand{\footrulewidth}{0.4pt}
+ \fancypagestyle{fancyplain}{
+ \fancyhf{}
+ \fancyhead[LE, RO]{\bfseries\thepage}
+ \fancyhead[LO]{\bfseries\rightmark}
+ \fancyhead[RE]{\bfseries\leftmark}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ }
+ \fancypagestyle{plain}{
+ \fancyhf{}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ \renewcommand{\headrulewidth}{0pt}
+ }
+ \pagestyle{fancyplain}
+ \renewcommand{\chaptermark}[1]{%
+ \markboth{#1}{}%
+ }
+ \renewcommand{\sectionmark}[1]{%
+ \markright{\thesection\ #1}%
+ }
+ % ToC, LoF, LoT, bibliography, and index
+ % Indices & bibliography
+ \usepackage{natbib}
+ \usepackage[titles]{tocloft}
+ \setcounter{tocdepth}{3}
+ \setcounter{secnumdepth}{5}
+ % creating indexes
+ \makeindex
+ \usepackage{newunicodechar}
+ \newunicodechar{⁻}{${}^{-}$}% Superscript minus
+ \newunicodechar{²}{${}^{2}$}% Superscript two
+ \newunicodechar{³}{${}^{3}$}% Superscript three
+ % Hyperlinks
+ % Hyperlinks (required, but should be loaded last)
+ \ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+ \else
+ \ifxetex
+ \usepackage[pagebackref=true]{hyperref}
+ \else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+ \fi
+ \fi
+ \hypersetup{%
+ colorlinks=true,%
+ linkcolor=blue,%
+ citecolor=blue,%
+ unicode,%
+ pdftitle={DBC framework},%
+ pdfsubject={}%
+ }
+ % Custom commands used by the header
+ % Custom commands
+ \newcommand{\clearemptydoublepage}{%
+ \newpage{\pagestyle{empty}\cleardoublepage}%
+ }
+ % caption style definition
+ \usepackage{caption}
+ \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}
+ % in page table of contents
+ \usepackage{etoc}
+ \etocsettocstyle{\doxytocparskip}{\doxynormalparskip}
+ % prevent numbers overlap the titles in toc
+ \renewcommand{\numberline}[1]{#1~}
+% End of preamble, now comes the document contents
+%===== C O N T E N T S =====
+\begin{document}
+ \raggedbottom
+ % Titlepage & ToC
+ % To avoid duplicate page anchors due to reuse of same numbers for
+ % the index (be it as roman numbers)
+ \hypersetup{pageanchor=false,
+ bookmarksnumbered=true,
+ pdfencoding=unicode
+ }
+ \pagenumbering{alph}
+ \begin{titlepage}
+ \vspace*{7cm}
+ \begin{center}%
+ {\Large DBC framework}\\
+ \vspace*{1cm}
+ {\large Generated by Doxygen 1.9.4}\\
+ \end{center}
+ \end{titlepage}
+ \clearemptydoublepage
+ \pagenumbering{roman}
+ \tableofcontents
+ \clearemptydoublepage
+ \pagenumbering{arabic}
+ % re-enable anchors again
+ \hypersetup{pageanchor=true}
+%--- Begin generated contents ---
+\chapter{DBC Parser and Runtime Decode Module Documentation}
+\label{md_README}
+\Hypertarget{md_README}
+\input{md_README}
+\chapter{Namespace Index}
+\input{namespaces}
+\chapter{Class Index}
+\input{annotated}
+\chapter{File Index}
+\input{files}
+\chapter{Namespace Documentation}
+\input{namespaceanonymous__namespace_02dbc__parser_8cpp_03}
+\chapter{Class Documentation}
+\input{structDbcDatabase}
+\input{classDbcDecodeBuilder}
+\input{classDbcDecoder}
+\input{classDbcParser}
+\input{classDbcTreeBuilder}
+\input{structDecodeDatabase}
+\input{structDecodedFrameValue}
+\input{structDecodedSignalValue}
+\input{structDecodeFrame}
+\input{structDecodeSignal}
+\input{structFrameInfo}
+\input{structFrameKey}
+\input{structFrameKeyHasher}
+\input{structRawCanFrame}
+\input{structSignalInfo}
+\input{classTreeNode}
+\chapter{File Documentation}
+\input{dbc__database_8h}
+\input{dbc__database_8h_source}
+\input{dbc__decode__builder_8cpp}
+\input{dbc__decode__builder_8cpp_source}
+\input{dbc__decode__builder_8h}
+\input{dbc__decode__builder_8h_source}
+\input{dbc__decoder_8cpp}
+\input{dbc__decoder_8cpp_source}
+\input{dbc__decoder_8h}
+\input{dbc__decoder_8h_source}
+\input{dbc__parser_8cpp}
+\input{dbc__parser_8cpp_source}
+\input{dbc__parser_8h}
+\input{dbc__parser_8h_source}
+\input{dbc__tree__builder_8cpp}
+\input{dbc__tree__builder_8cpp_source}
+\input{dbc__tree__builder_8h}
+\input{dbc__tree__builder_8h_source}
+\input{decode__database_8h}
+\input{decode__database_8h_source}
+\input{frame__info_8h}
+\input{frame__info_8h_source}
+\input{main_8cpp}
+\input{main_8cpp_source}
+\input{README_8md}
+\input{signal__info_8h}
+\input{signal__info_8h_source}
+\input{tree__node_8cpp}
+\input{tree__node_8cpp_source}
+\input{tree__node_8h}
+\input{tree__node_8h_source}
+%--- End generated contents ---
+% Index
+ \backmatter
+ \newpage
+ \phantomsection
+ \clearemptydoublepage
+ \addcontentsline{toc}{chapter}{\indexname}
+ \printindex
+% Required for some languages (in combination with latexdocumentpre from the header)
+\end{document}
diff --git a/docs/latex/signal__info_8h.tex b/docs/latex/signal__info_8h.tex
new file mode 100644
index 0000000..2474814
--- /dev/null
+++ b/docs/latex/signal__info_8h.tex
@@ -0,0 +1,24 @@
+\hypertarget{signal__info_8h}{}\doxysection{signal\+\_\+info.\+h File Reference}
+\label{signal__info_8h}\index{signal\_info.h@{signal\_info.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$string$>$}\newline
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$cstdint$>$}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structSignalInfo}{Signal\+Info}}
+\begin{DoxyCompactList}\small\item\em Describes one signal inside a DBC frame. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
diff --git a/docs/latex/signal__info_8h_source.tex b/docs/latex/signal__info_8h_source.tex
new file mode 100644
index 0000000..36a5e8e
--- /dev/null
+++ b/docs/latex/signal__info_8h_source.tex
@@ -0,0 +1,57 @@
+\hypertarget{signal__info_8h_source}{}\doxysection{signal\+\_\+info.\+h}
+\mbox{\hyperlink{signal__info_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00002}00002 \textcolor{comment}{ * @file signal\_info.h}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef SIGNAL\_INFO\_H}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00013}00013 \textcolor{preprocessor}{\#define SIGNAL\_INFO\_H}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00018}00018 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00019}00019 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00020}00020 \textcolor{comment}{ * @brief Describes one signal inside a DBC frame.}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00021}00021 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00022}\mbox{\hyperlink{structSignalInfo}{00022}} \textcolor{keyword}{struct }\mbox{\hyperlink{structSignalInfo}{SignalInfo}} \{}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00023}\mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{00023}} std::string \mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}}; \textcolor{comment}{/**< Signal name. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00024}\mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{00024}} std::uint32\_t \mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}}; \textcolor{comment}{/**< Start bit in DBC notation. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00025}\mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{00025}} std::uint32\_t \mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}}; \textcolor{comment}{/**< Signal length in bits. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00026}\mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{00026}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}}; \textcolor{comment}{/**< true for Intel, false for Motorola. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00027}\mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{00027}} \textcolor{keywordtype}{bool} \mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}}; \textcolor{comment}{/**< true if signal is signed. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00028}\mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{00028}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}}; \textcolor{comment}{/**< Scaling factor. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00029}\mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{00029}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}}; \textcolor{comment}{/**< Physical offset. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00030}\mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{00030}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}}; \textcolor{comment}{/**< Minimum physical value. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00031}\mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{00031}} \textcolor{keywordtype}{double} \mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}}; \textcolor{comment}{/**< Maximum physical value. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00032}\mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{00032}} std::string \mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}}; \textcolor{comment}{/**< Physical unit. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00033}\mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{00033}} std::vector \mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}}; \textcolor{comment}{/**< Signal receivers. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00034}\mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{00034}} std::string \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}}; \textcolor{comment}{/**< Optional signal comment. */}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00035}00035 }
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00036}\mbox{\hyperlink{structSignalInfo_aa2d2cd238118015258e271dce92a971e}{00036}} \mbox{\hyperlink{structSignalInfo_aa2d2cd238118015258e271dce92a971e}{SignalInfo}}()}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00037}00037 : \mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}}()}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00038}00038 , \mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{startBit}} (0U)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00039}00039 , \mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}} (0U)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00040}00040 , \mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{isLittleEndian}} (true)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00041}00041 , \mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{isSigned}} (false)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00042}00042 , \mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}} (1.0)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00043}00043 , \mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}} (0.0)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00044}00044 , \mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}} (0.0)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00045}00045 , \mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}} (0.0)}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00046}00046 , \mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}}()}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00047}00047 , \mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}}()}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00048}00048 , \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}}() \{}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00049}00049 \}}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00050}00050 \};}
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00051}00051 }
+\DoxyCodeLine{\Hypertarget{signal__info_8h_source_l00052}00052 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* SIGNAL\_INFO\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/latex/structDbcDatabase.tex b/docs/latex/structDbcDatabase.tex
new file mode 100644
index 0000000..b7ee57e
--- /dev/null
+++ b/docs/latex/structDbcDatabase.tex
@@ -0,0 +1,45 @@
+\hypertarget{structDbcDatabase}{}\doxysection{Dbc\+Database Struct Reference}
+\label{structDbcDatabase}\index{DbcDatabase@{DbcDatabase}}
+
+
+Parsed DBC content stored in a simple internal form.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+database.\+h$>$}
+
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::vector$<$ \mbox{\hyperlink{structFrameInfo}{Frame\+Info}} $>$ \mbox{\hyperlink{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}{frames}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Parsed DBC content stored in a simple internal form.
+
+Definition at line \mbox{\hyperlink{dbc__database_8h_source_l00022}{22}} of file \mbox{\hyperlink{dbc__database_8h_source}{dbc\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}\label{structDbcDatabase_a2cade5d0234ee816132127542f8c612b}}
+\index{DbcDatabase@{DbcDatabase}!frames@{frames}}
+\index{frames@{frames}!DbcDatabase@{DbcDatabase}}
+\doxysubsubsection{\texorpdfstring{frames}{frames}}
+{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structFrameInfo}{Frame\+Info}}$>$ Dbc\+Database\+::frames}
+
+All frames found in the DBC file.
+
+Definition at line \mbox{\hyperlink{dbc__database_8h_source_l00023}{23}} of file \mbox{\hyperlink{dbc__database_8h_source}{dbc\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{Dbc\+Tree\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00337}{Dbc\+Parser\+::\+Find\+Frame\+By\+Id()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Dbc\+Parser\+::\+Parse\+File()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__database_8h}{dbc\+\_\+database.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structDecodeDatabase.tex b/docs/latex/structDecodeDatabase.tex
new file mode 100644
index 0000000..e20ba9c
--- /dev/null
+++ b/docs/latex/structDecodeDatabase.tex
@@ -0,0 +1,61 @@
+\hypertarget{structDecodeDatabase}{}\doxysection{Decode\+Database Struct Reference}
+\label{structDecodeDatabase}\index{DecodeDatabase@{DecodeDatabase}}
+
+
+Runtime decode database with fast lookup by CAN ID.
+
+
+
+
+{\ttfamily \#include $<$decode\+\_\+database.\+h$>$}
+
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::vector$<$ \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $>$ \mbox{\hyperlink{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}{frames}}
+\item
+std\+::unordered\+\_\+map$<$ \mbox{\hyperlink{structFrameKey}{Frame\+Key}}, std\+::size\+\_\+t, \mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}} $>$ \mbox{\hyperlink{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}{frame\+Index\+By\+Key}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Runtime decode database with fast lookup by CAN ID.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00132}{132}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}\label{structDecodeDatabase_ae4fd1351008bb0dce337821a849100c5}}
+\index{DecodeDatabase@{DecodeDatabase}!frameIndexByKey@{frameIndexByKey}}
+\index{frameIndexByKey@{frameIndexByKey}!DecodeDatabase@{DecodeDatabase}}
+\doxysubsubsection{\texorpdfstring{frameIndexByKey}{frameIndexByKey}}
+{\footnotesize\ttfamily std\+::unordered\+\_\+map$<$\mbox{\hyperlink{structFrameKey}{Frame\+Key}}, std\+::size\+\_\+t, \mbox{\hyperlink{structFrameKeyHasher}{Frame\+Key\+Hasher}}$>$ Decode\+Database\+::frame\+Index\+By\+Key}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00134}{134}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{Dbc\+Decoder\+::\+Find\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}\label{structDecodeDatabase_a2bd4ddfc2602c1de4e12a373bfc93072}}
+\index{DecodeDatabase@{DecodeDatabase}!frames@{frames}}
+\index{frames@{frames}!DecodeDatabase@{DecodeDatabase}}
+\doxysubsubsection{\texorpdfstring{frames}{frames}}
+{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}$>$ Decode\+Database\+::frames}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00133}{133}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00014}{Dbc\+Decoder\+::\+Find\+Frame()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structDecodeFrame.tex b/docs/latex/structDecodeFrame.tex
new file mode 100644
index 0000000..5ded82b
--- /dev/null
+++ b/docs/latex/structDecodeFrame.tex
@@ -0,0 +1,191 @@
+\hypertarget{structDecodeFrame}{}\doxysection{Decode\+Frame Struct Reference}
+\label{structDecodeFrame}\index{DecodeFrame@{DecodeFrame}}
+
+
+Runtime-\/ready frame definition.
+
+
+
+
+{\ttfamily \#include $<$decode\+\_\+database.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}{Decode\+Frame}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::string \mbox{\hyperlink{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}{name}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}{can\+Id}}
+\item
+bool \mbox{\hyperlink{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}{is\+Extended}}
+\item
+std\+::uint8\+\_\+t \mbox{\hyperlink{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}{dlc}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}{pgn}}
+\item
+bool \mbox{\hyperlink{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}{has\+Pgn}}
+\item
+std\+::string \mbox{\hyperlink{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}{transmitter}}
+\item
+std\+::string \mbox{\hyperlink{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}{comment}}
+\item
+std\+::vector$<$ \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} $>$ \mbox{\hyperlink{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}{signals}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Runtime-\/ready frame definition.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00072}{72}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}\label{structDecodeFrame_ae6ae88ee29bcaff936e7c7b2380f96b4}}
+\index{DecodeFrame@{DecodeFrame}!DecodeFrame@{DecodeFrame}}
+\index{DecodeFrame@{DecodeFrame}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{DecodeFrame()}{DecodeFrame()}}
+{\footnotesize\ttfamily Decode\+Frame\+::\+Decode\+Frame (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00083}{83}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}\label{structDecodeFrame_a52e10215388db7df8b541b9d9909edcf}}
+\index{DecodeFrame@{DecodeFrame}!canId@{canId}}
+\index{canId@{canId}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{canId}{canId}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Frame\+::can\+Id}
+
+Normalized CAN ID.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00074}{74}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}\label{structDecodeFrame_a25819ef907a32391af5c9f7cae9cdb22}}
+\index{DecodeFrame@{DecodeFrame}!comment@{comment}}
+\index{comment@{comment}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{comment}{comment}}
+{\footnotesize\ttfamily std\+::string Decode\+Frame\+::comment}
+
+Frame comment.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00080}{80}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}\label{structDecodeFrame_a51111ac13988be372d5673d12cf3e060}}
+\index{DecodeFrame@{DecodeFrame}!dlc@{dlc}}
+\index{dlc@{dlc}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{dlc}{dlc}}
+{\footnotesize\ttfamily std\+::uint8\+\_\+t Decode\+Frame\+::dlc}
+
+Payload length.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00076}{76}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}\label{structDecodeFrame_a2551102670c4a540fced4c71da0b369d}}
+\index{DecodeFrame@{DecodeFrame}!hasPgn@{hasPgn}}
+\index{hasPgn@{hasPgn}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{hasPgn}{hasPgn}}
+{\footnotesize\ttfamily bool Decode\+Frame\+::has\+Pgn}
+
+true if PGN is valid.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00078}{78}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}\label{structDecodeFrame_a3ee2348d781f8f15aaf87e8dcf57ec41}}
+\index{DecodeFrame@{DecodeFrame}!isExtended@{isExtended}}
+\index{isExtended@{isExtended}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}}
+{\footnotesize\ttfamily bool Decode\+Frame\+::is\+Extended}
+
+true for extended frame.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00075}{75}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}\label{structDecodeFrame_aa0a7f8fd5bfde2148dfd0d838328f579}}
+\index{DecodeFrame@{DecodeFrame}!name@{name}}
+\index{name@{name}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{name}{name}}
+{\footnotesize\ttfamily std\+::string Decode\+Frame\+::name}
+
+Frame name.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00073}{73}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}\label{structDecodeFrame_a1d3c54055c0cbceb73adf551f7067f23}}
+\index{DecodeFrame@{DecodeFrame}!pgn@{pgn}}
+\index{pgn@{pgn}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{pgn}{pgn}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Frame\+::pgn}
+
+PGN if available.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00077}{77}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}\label{structDecodeFrame_a372afd9e74f1ae33f85cb4acfd3e2036}}
+\index{DecodeFrame@{DecodeFrame}!signals@{signals}}
+\index{signals@{signals}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{signals}{signals}}
+{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}$>$ Decode\+Frame\+::signals}
+
+Signal definitions.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00081}{81}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}.
+
+\mbox{\Hypertarget{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}\label{structDecodeFrame_ad78241dc40c793aabb8495b6989b81a9}}
+\index{DecodeFrame@{DecodeFrame}!transmitter@{transmitter}}
+\index{transmitter@{transmitter}!DecodeFrame@{DecodeFrame}}
+\doxysubsubsection{\texorpdfstring{transmitter}{transmitter}}
+{\footnotesize\ttfamily std\+::string Decode\+Frame\+::transmitter}
+
+Transmitter ECU.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00079}{79}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structDecodeSignal.tex b/docs/latex/structDecodeSignal.tex
new file mode 100644
index 0000000..a1df328
--- /dev/null
+++ b/docs/latex/structDecodeSignal.tex
@@ -0,0 +1,239 @@
+\hypertarget{structDecodeSignal}{}\doxysection{Decode\+Signal Struct Reference}
+\label{structDecodeSignal}\index{DecodeSignal@{DecodeSignal}}
+
+
+Runtime-\/ready signal definition.
+
+
+
+
+{\ttfamily \#include $<$decode\+\_\+database.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structDecodeSignal_a93fd97267e2614979440261628e493f5}{Decode\+Signal}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::string \mbox{\hyperlink{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}{name}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}{start\+Bit}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}{length}}
+\item
+\mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}} \mbox{\hyperlink{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}{byte\+Order}}
+\item
+\mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}} \mbox{\hyperlink{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}{value\+Type}}
+\item
+double \mbox{\hyperlink{structDecodeSignal_a428c39913a366a8476dd291061354391}{factor}}
+\item
+double \mbox{\hyperlink{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}{offset}}
+\item
+double \mbox{\hyperlink{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}{minimum}}
+\item
+double \mbox{\hyperlink{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}{maximum}}
+\item
+std\+::string \mbox{\hyperlink{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}{unit}}
+\item
+std\+::vector$<$ std\+::string $>$ \mbox{\hyperlink{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}{receivers}}
+\item
+std\+::string \mbox{\hyperlink{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}{comment}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Runtime-\/ready signal definition.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00039}{39}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structDecodeSignal_a93fd97267e2614979440261628e493f5}\label{structDecodeSignal_a93fd97267e2614979440261628e493f5}}
+\index{DecodeSignal@{DecodeSignal}!DecodeSignal@{DecodeSignal}}
+\index{DecodeSignal@{DecodeSignal}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{DecodeSignal()}{DecodeSignal()}}
+{\footnotesize\ttfamily Decode\+Signal\+::\+Decode\+Signal (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00053}{53}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}\label{structDecodeSignal_abdc4c4bb4a67a6d61d6ca81e8a52833d}}
+\index{DecodeSignal@{DecodeSignal}!byteOrder@{byteOrder}}
+\index{byteOrder@{byteOrder}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{byteOrder}{byteOrder}}
+{\footnotesize\ttfamily \mbox{\hyperlink{decode__database_8h_aaeb92d42f5a6e27b8ba19f18d69d142b}{Byte\+Order}} Decode\+Signal\+::byte\+Order}
+
+Intel or Motorola.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00043}{43}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Dbc\+Decoder\+::\+Extract\+Unsigned()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}\label{structDecodeSignal_ae28c905d4a2bc86419c2a8361bfea473}}
+\index{DecodeSignal@{DecodeSignal}!comment@{comment}}
+\index{comment@{comment}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{comment}{comment}}
+{\footnotesize\ttfamily std\+::string Decode\+Signal\+::comment}
+
+Comment.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00051}{51}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a428c39913a366a8476dd291061354391}\label{structDecodeSignal_a428c39913a366a8476dd291061354391}}
+\index{DecodeSignal@{DecodeSignal}!factor@{factor}}
+\index{factor@{factor}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{factor}{factor}}
+{\footnotesize\ttfamily double Decode\+Signal\+::factor}
+
+Scaling factor.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00045}{45}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}\label{structDecodeSignal_acd4ef5ee30421d117b5756854302debb}}
+\index{DecodeSignal@{DecodeSignal}!length@{length}}
+\index{length@{length}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{length}{length}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Signal\+::length}
+
+Signal length in bits.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00042}{42}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Dbc\+Decoder\+::\+Extract\+Unsigned()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}\label{structDecodeSignal_a4a6ba87142a9badbf0ca830e9e709cb7}}
+\index{DecodeSignal@{DecodeSignal}!maximum@{maximum}}
+\index{maximum@{maximum}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{maximum}{maximum}}
+{\footnotesize\ttfamily double Decode\+Signal\+::maximum}
+
+Maximum physical value.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00048}{48}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}\label{structDecodeSignal_a0fb84e19a0ab3bd50b6f65c1075ebc25}}
+\index{DecodeSignal@{DecodeSignal}!minimum@{minimum}}
+\index{minimum@{minimum}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{minimum}{minimum}}
+{\footnotesize\ttfamily double Decode\+Signal\+::minimum}
+
+Minimum physical value.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00047}{47}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}\label{structDecodeSignal_a58cf5844f2272a23dcb9687d912e4780}}
+\index{DecodeSignal@{DecodeSignal}!name@{name}}
+\index{name@{name}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{name}{name}}
+{\footnotesize\ttfamily std\+::string Decode\+Signal\+::name}
+
+Signal name.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00040}{40}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}\label{structDecodeSignal_a92db637af4e224a0ae70173050dc3f74}}
+\index{DecodeSignal@{DecodeSignal}!offset@{offset}}
+\index{offset@{offset}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{offset}{offset}}
+{\footnotesize\ttfamily double Decode\+Signal\+::offset}
+
+Physical offset.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00046}{46}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}\label{structDecodeSignal_abdbae62a64d2df716bf60c6b67b30eaa}}
+\index{DecodeSignal@{DecodeSignal}!receivers@{receivers}}
+\index{receivers@{receivers}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{receivers}{receivers}}
+{\footnotesize\ttfamily std\+::vector$<$std\+::string$>$ Decode\+Signal\+::receivers}
+
+Receivers.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00050}{50}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}\label{structDecodeSignal_aaf5d7527ddf65b6355c2b4f3626df22d}}
+\index{DecodeSignal@{DecodeSignal}!startBit@{startBit}}
+\index{startBit@{startBit}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{startBit}{startBit}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Decode\+Signal\+::start\+Bit}
+
+DBC start bit.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00041}{41}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00070}{Dbc\+Decoder\+::\+Extract\+Unsigned()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}\label{structDecodeSignal_a38eed9ca7581423fd8bfbedcffc12092}}
+\index{DecodeSignal@{DecodeSignal}!unit@{unit}}
+\index{unit@{unit}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{unit}{unit}}
+{\footnotesize\ttfamily std\+::string Decode\+Signal\+::unit}
+
+Physical unit.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00049}{49}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}\label{structDecodeSignal_a9d37638129263b8902ba5be59baf39a8}}
+\index{DecodeSignal@{DecodeSignal}!valueType@{valueType}}
+\index{valueType@{valueType}!DecodeSignal@{DecodeSignal}}
+\doxysubsubsection{\texorpdfstring{valueType}{valueType}}
+{\footnotesize\ttfamily \mbox{\hyperlink{decode__database_8h_ad9971b6ef33e02ba2c75d19c1d2518a1}{Value\+Type}} Decode\+Signal\+::value\+Type}
+
+Signed or unsigned.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00044}{44}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structDecodedFrameValue.tex b/docs/latex/structDecodedFrameValue.tex
new file mode 100644
index 0000000..6007866
--- /dev/null
+++ b/docs/latex/structDecodedFrameValue.tex
@@ -0,0 +1,95 @@
+\hypertarget{structDecodedFrameValue}{}\doxysection{Decoded\+Frame\+Value Struct Reference}
+\label{structDecodedFrameValue}\index{DecodedFrameValue@{DecodedFrameValue}}
+
+
+Fully decoded frame.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}{Decoded\+Frame\+Value}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}} $\ast$ \mbox{\hyperlink{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}{definition}}
+\item
+std\+::vector$<$ \mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}} $>$ \mbox{\hyperlink{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}{signals}}
+\item
+bool \mbox{\hyperlink{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}{valid}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Fully decoded frame.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00055}{55}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}\label{structDecodedFrameValue_a19f754bb84e67e6ae71ea93b9ae6382b}}
+\index{DecodedFrameValue@{DecodedFrameValue}!DecodedFrameValue@{DecodedFrameValue}}
+\index{DecodedFrameValue@{DecodedFrameValue}!DecodedFrameValue@{DecodedFrameValue}}
+\doxysubsubsection{\texorpdfstring{DecodedFrameValue()}{DecodedFrameValue()}}
+{\footnotesize\ttfamily Decoded\+Frame\+Value\+::\+Decoded\+Frame\+Value (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00060}{60}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}\label{structDecodedFrameValue_a60dda1cc352d2c8087f0bdbc81dd266c}}
+\index{DecodedFrameValue@{DecodedFrameValue}!definition@{definition}}
+\index{definition@{definition}!DecodedFrameValue@{DecodedFrameValue}}
+\doxysubsubsection{\texorpdfstring{definition}{definition}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{structDecodeFrame}{Decode\+Frame}}$\ast$ Decoded\+Frame\+Value\+::definition}
+
+Frame definition.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00056}{56}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}\label{structDecodedFrameValue_a8440e0e5d7953102095b029f522022d3}}
+\index{DecodedFrameValue@{DecodedFrameValue}!signals@{signals}}
+\index{signals@{signals}!DecodedFrameValue@{DecodedFrameValue}}
+\doxysubsubsection{\texorpdfstring{signals}{signals}}
+{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structDecodedSignalValue}{Decoded\+Signal\+Value}}$>$ Decoded\+Frame\+Value\+::signals}
+
+Decoded signal values.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00057}{57}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}\label{structDecodedFrameValue_a4f51c31110dba1f73a763c596372beb0}}
+\index{DecodedFrameValue@{DecodedFrameValue}!valid@{valid}}
+\index{valid@{valid}!DecodedFrameValue@{DecodedFrameValue}}
+\doxysubsubsection{\texorpdfstring{valid}{valid}}
+{\footnotesize\ttfamily bool Decoded\+Frame\+Value\+::valid}
+
+true if frame was matched.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00058}{58}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structDecodedSignalValue.tex b/docs/latex/structDecodedSignalValue.tex
new file mode 100644
index 0000000..1101ed5
--- /dev/null
+++ b/docs/latex/structDecodedSignalValue.tex
@@ -0,0 +1,111 @@
+\hypertarget{structDecodedSignalValue}{}\doxysection{Decoded\+Signal\+Value Struct Reference}
+\label{structDecodedSignalValue}\index{DecodedSignalValue@{DecodedSignalValue}}
+
+
+One decoded signal value.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}{Decoded\+Signal\+Value}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}} $\ast$ \mbox{\hyperlink{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}{definition}}
+\item
+std\+::int64\+\_\+t \mbox{\hyperlink{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}{raw\+Value}}
+\item
+double \mbox{\hyperlink{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}{physical\+Value}}
+\item
+bool \mbox{\hyperlink{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}{valid}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+One decoded signal value.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00038}{38}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}\label{structDecodedSignalValue_a1481b122a7ce5a618012b1133c6adedf}}
+\index{DecodedSignalValue@{DecodedSignalValue}!DecodedSignalValue@{DecodedSignalValue}}
+\index{DecodedSignalValue@{DecodedSignalValue}!DecodedSignalValue@{DecodedSignalValue}}
+\doxysubsubsection{\texorpdfstring{DecodedSignalValue()}{DecodedSignalValue()}}
+{\footnotesize\ttfamily Decoded\+Signal\+Value\+::\+Decoded\+Signal\+Value (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00044}{44}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}\label{structDecodedSignalValue_acadc3b3bb21dd6b0412d342c7e6b20d7}}
+\index{DecodedSignalValue@{DecodedSignalValue}!definition@{definition}}
+\index{definition@{definition}!DecodedSignalValue@{DecodedSignalValue}}
+\doxysubsubsection{\texorpdfstring{definition}{definition}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{structDecodeSignal}{Decode\+Signal}}$\ast$ Decoded\+Signal\+Value\+::definition}
+
+Signal definition.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00039}{39}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}\label{structDecodedSignalValue_a6847d05b3cb00d5e0f6c611968f57978}}
+\index{DecodedSignalValue@{DecodedSignalValue}!physicalValue@{physicalValue}}
+\index{physicalValue@{physicalValue}!DecodedSignalValue@{DecodedSignalValue}}
+\doxysubsubsection{\texorpdfstring{physicalValue}{physicalValue}}
+{\footnotesize\ttfamily double Decoded\+Signal\+Value\+::physical\+Value}
+
+Converted physical value.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00041}{41}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}\label{structDecodedSignalValue_a5138b825940e34689f7b3891627ee9ec}}
+\index{DecodedSignalValue@{DecodedSignalValue}!rawValue@{rawValue}}
+\index{rawValue@{rawValue}!DecodedSignalValue@{DecodedSignalValue}}
+\doxysubsubsection{\texorpdfstring{rawValue}{rawValue}}
+{\footnotesize\ttfamily std\+::int64\+\_\+t Decoded\+Signal\+Value\+::raw\+Value}
+
+Extracted raw integer value.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00040}{40}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+\mbox{\Hypertarget{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}\label{structDecodedSignalValue_aac0ed361af545cde48d0e6f41a859686}}
+\index{DecodedSignalValue@{DecodedSignalValue}!valid@{valid}}
+\index{valid@{valid}!DecodedSignalValue@{DecodedSignalValue}}
+\doxysubsubsection{\texorpdfstring{valid}{valid}}
+{\footnotesize\ttfamily bool Decoded\+Signal\+Value\+::valid}
+
+true if decoding succeeded.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00042}{42}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00075}{Print\+Decoded\+Frame()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structFrameInfo.tex b/docs/latex/structFrameInfo.tex
new file mode 100644
index 0000000..d150190
--- /dev/null
+++ b/docs/latex/structFrameInfo.tex
@@ -0,0 +1,191 @@
+\hypertarget{structFrameInfo}{}\doxysection{Frame\+Info Struct Reference}
+\label{structFrameInfo}\index{FrameInfo@{FrameInfo}}
+
+
+Describes one CAN frame from a DBC file.
+
+
+
+
+{\ttfamily \#include $<$frame\+\_\+info.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}{Frame\+Info}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::string \mbox{\hyperlink{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}{name}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}{can\+Id}}
+\item
+bool \mbox{\hyperlink{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}{is\+Extended}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}{pgn}}
+\item
+bool \mbox{\hyperlink{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}{has\+Pgn}}
+\item
+std\+::uint8\+\_\+t \mbox{\hyperlink{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}{dlc}}
+\item
+std\+::string \mbox{\hyperlink{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}{transmitter}}
+\item
+std\+::string \mbox{\hyperlink{structFrameInfo_ace75121294f9d89b762080ab5643293c}{comment}}
+\item
+std\+::vector$<$ \mbox{\hyperlink{structSignalInfo}{Signal\+Info}} $>$ \mbox{\hyperlink{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}{signals}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Describes one CAN frame from a DBC file.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00024}{24}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}\label{structFrameInfo_a7f2d192b7969f7b60479a48e1f7eba61}}
+\index{FrameInfo@{FrameInfo}!FrameInfo@{FrameInfo}}
+\index{FrameInfo@{FrameInfo}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{FrameInfo()}{FrameInfo()}}
+{\footnotesize\ttfamily Frame\+Info\+::\+Frame\+Info (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00035}{35}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}\label{structFrameInfo_af470b0742c05bfbffc31c51a68f5c05e}}
+\index{FrameInfo@{FrameInfo}!canId@{canId}}
+\index{canId@{canId}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{canId}{canId}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Frame\+Info\+::can\+Id}
+
+Normalized CAN identifier.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00026}{26}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structFrameInfo_ace75121294f9d89b762080ab5643293c}\label{structFrameInfo_ace75121294f9d89b762080ab5643293c}}
+\index{FrameInfo@{FrameInfo}!comment@{comment}}
+\index{comment@{comment}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{comment}{comment}}
+{\footnotesize\ttfamily std\+::string Frame\+Info\+::comment}
+
+Optional frame comment.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00032}{32}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Dbc\+Parser\+::\+Parse\+Comment\+Line()}}.
+
+\mbox{\Hypertarget{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}\label{structFrameInfo_aa2b198ea0f55e560c123d35e7b3ecab9}}
+\index{FrameInfo@{FrameInfo}!dlc@{dlc}}
+\index{dlc@{dlc}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{dlc}{dlc}}
+{\footnotesize\ttfamily std\+::uint8\+\_\+t Frame\+Info\+::dlc}
+
+Frame payload length.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00030}{30}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}\label{structFrameInfo_a4737a5420213ad4304724e39f3a4e55d}}
+\index{FrameInfo@{FrameInfo}!hasPgn@{hasPgn}}
+\index{hasPgn@{hasPgn}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{hasPgn}{hasPgn}}
+{\footnotesize\ttfamily bool Frame\+Info\+::has\+Pgn}
+
+true if PGN was derived.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00029}{29}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}\label{structFrameInfo_a34b726afaad2ac5c697fdb2ac070cdaf}}
+\index{FrameInfo@{FrameInfo}!isExtended@{isExtended}}
+\index{isExtended@{isExtended}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}}
+{\footnotesize\ttfamily bool Frame\+Info\+::is\+Extended}
+
+true for extended frame.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00027}{27}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}\label{structFrameInfo_abb53a7f93ed7abc0ea1ae4a8ccafcdcb}}
+\index{FrameInfo@{FrameInfo}!name@{name}}
+\index{name@{name}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{name}{name}}
+{\footnotesize\ttfamily std\+::string Frame\+Info\+::name}
+
+Frame name.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00025}{25}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}.
+
+\mbox{\Hypertarget{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}\label{structFrameInfo_aee518b33f1000bf0b7f6e4a87474c943}}
+\index{FrameInfo@{FrameInfo}!pgn@{pgn}}
+\index{pgn@{pgn}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{pgn}{pgn}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Frame\+Info\+::pgn}
+
+J1939 PGN if applicable.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00028}{28}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}\label{structFrameInfo_a942937027f1af06536f98cc23b2bf6ce}}
+\index{FrameInfo@{FrameInfo}!signals@{signals}}
+\index{signals@{signals}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{signals}{signals}}
+{\footnotesize\ttfamily std\+::vector$<$\mbox{\hyperlink{structSignalInfo}{Signal\+Info}}$>$ Frame\+Info\+::signals}
+
+Signals contained in the frame.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00033}{33}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__tree__builder_8cpp_source_l00014}{Dbc\+Tree\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00349}{Dbc\+Parser\+::\+Find\+Signal\+By\+Name()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00040}{Dbc\+Parser\+::\+Parse\+File()}}.
+
+\mbox{\Hypertarget{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}\label{structFrameInfo_a92749ec3798d4211a505860fb389a9e8}}
+\index{FrameInfo@{FrameInfo}!transmitter@{transmitter}}
+\index{transmitter@{transmitter}!FrameInfo@{FrameInfo}}
+\doxysubsubsection{\texorpdfstring{transmitter}{transmitter}}
+{\footnotesize\ttfamily std\+::string Frame\+Info\+::transmitter}
+
+Transmitter ECU name.
+
+Definition at line \mbox{\hyperlink{frame__info_8h_source_l00031}{31}} of file \mbox{\hyperlink{frame__info_8h_source}{frame\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00142}{Dbc\+Parser\+::\+Parse\+Frame\+Line()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{frame__info_8h}{frame\+\_\+info.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structFrameKey.tex b/docs/latex/structFrameKey.tex
new file mode 100644
index 0000000..174e5b8
--- /dev/null
+++ b/docs/latex/structFrameKey.tex
@@ -0,0 +1,110 @@
+\hypertarget{structFrameKey}{}\doxysection{Frame\+Key Struct Reference}
+\label{structFrameKey}\index{FrameKey@{FrameKey}}
+
+
+Key for fast frame lookup.
+
+
+
+
+{\ttfamily \#include $<$decode\+\_\+database.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}{Frame\+Key}} ()
+\item
+\mbox{\hyperlink{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}{Frame\+Key}} (std\+::uint32\+\_\+t id, bool extended)
+\item
+bool \mbox{\hyperlink{structFrameKey_aaaec9f914e127787247fcda5e183b01f}{operator==}} (const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&other) const
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}{can\+Id}}
+\item
+bool \mbox{\hyperlink{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}{is\+Extended}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Key for fast frame lookup.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00099}{99}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}\label{structFrameKey_a0e9aad56b251cdf802d45a9c19050b14}}
+\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}}
+\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}}
+\doxysubsubsection{\texorpdfstring{FrameKey()}{FrameKey()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily Frame\+Key\+::\+Frame\+Key (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00103}{103}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+\mbox{\Hypertarget{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}\label{structFrameKey_a33bde405c7ea53000d54b3dd6e058670}}
+\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}}
+\index{FrameKey@{FrameKey}!FrameKey@{FrameKey}}
+\doxysubsubsection{\texorpdfstring{FrameKey()}{FrameKey()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily Frame\+Key\+::\+Frame\+Key (\begin{DoxyParamCaption}\item[{std\+::uint32\+\_\+t}]{id, }\item[{bool}]{extended }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00108}{108}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{structFrameKey_aaaec9f914e127787247fcda5e183b01f}\label{structFrameKey_aaaec9f914e127787247fcda5e183b01f}}
+\index{FrameKey@{FrameKey}!operator==@{operator==}}
+\index{operator==@{operator==}!FrameKey@{FrameKey}}
+\doxysubsubsection{\texorpdfstring{operator==()}{operator==()}}
+{\footnotesize\ttfamily bool Frame\+Key\+::operator== (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&}]{other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00113}{113}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+References \mbox{\hyperlink{decode__database_8h_source_l00100}{can\+Id}}, and \mbox{\hyperlink{decode__database_8h_source_l00101}{is\+Extended}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}\label{structFrameKey_a022917652b4d3c2f2dfcc5a13ab7caa4}}
+\index{FrameKey@{FrameKey}!canId@{canId}}
+\index{canId@{canId}!FrameKey@{FrameKey}}
+\doxysubsubsection{\texorpdfstring{canId}{canId}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Frame\+Key\+::can\+Id}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00100}{100}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{decode__database_8h_source_l00122}{Frame\+Key\+Hasher\+::operator()()}}, and \mbox{\hyperlink{decode__database_8h_source_l00113}{operator==()}}.
+
+\mbox{\Hypertarget{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}\label{structFrameKey_aa3179b709d02ef70cf0e736f040a2145}}
+\index{FrameKey@{FrameKey}!isExtended@{isExtended}}
+\index{isExtended@{isExtended}!FrameKey@{FrameKey}}
+\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}}
+{\footnotesize\ttfamily bool Frame\+Key\+::is\+Extended}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00101}{101}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{decode__database_8h_source_l00122}{Frame\+Key\+Hasher\+::operator()()}}, and \mbox{\hyperlink{decode__database_8h_source_l00113}{operator==()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structFrameKeyHasher.tex b/docs/latex/structFrameKeyHasher.tex
new file mode 100644
index 0000000..1bec1a6
--- /dev/null
+++ b/docs/latex/structFrameKeyHasher.tex
@@ -0,0 +1,45 @@
+\hypertarget{structFrameKeyHasher}{}\doxysection{Frame\+Key\+Hasher Struct Reference}
+\label{structFrameKeyHasher}\index{FrameKeyHasher@{FrameKeyHasher}}
+
+
+Hasher for frame key.
+
+
+
+
+{\ttfamily \#include $<$decode\+\_\+database.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+std\+::size\+\_\+t \mbox{\hyperlink{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}{operator()}} (const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&key) const
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Hasher for frame key.
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00121}{121}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}\label{structFrameKeyHasher_a1612ce56b513790e3ed4c06ec7d28b9f}}
+\index{FrameKeyHasher@{FrameKeyHasher}!operator()@{operator()}}
+\index{operator()@{operator()}!FrameKeyHasher@{FrameKeyHasher}}
+\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}}
+{\footnotesize\ttfamily std\+::size\+\_\+t Frame\+Key\+Hasher\+::operator() (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structFrameKey}{Frame\+Key}} \&}]{key }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{decode__database_8h_source_l00122}{122}} of file \mbox{\hyperlink{decode__database_8h_source}{decode\+\_\+database.\+h}}.
+
+
+
+References \mbox{\hyperlink{decode__database_8h_source_l00100}{Frame\+Key\+::can\+Id}}, and \mbox{\hyperlink{decode__database_8h_source_l00101}{Frame\+Key\+::is\+Extended}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{decode__database_8h}{decode\+\_\+database.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structRawCanFrame.tex b/docs/latex/structRawCanFrame.tex
new file mode 100644
index 0000000..f0c23e9
--- /dev/null
+++ b/docs/latex/structRawCanFrame.tex
@@ -0,0 +1,95 @@
+\hypertarget{structRawCanFrame}{}\doxysection{Raw\+Can\+Frame Struct Reference}
+\label{structRawCanFrame}\index{RawCanFrame@{RawCanFrame}}
+
+
+Raw CAN frame used for runtime or trace decoding.
+
+
+
+
+{\ttfamily \#include $<$dbc\+\_\+decoder.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}{Raw\+Can\+Frame}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}{can\+Id}}
+\item
+bool \mbox{\hyperlink{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}{is\+Extended}}
+\item
+std\+::vector$<$ std\+::uint8\+\_\+t $>$ \mbox{\hyperlink{structRawCanFrame_a0acb487612104c99c9907344c035df83}{data}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Raw CAN frame used for runtime or trace decoding.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00023}{23}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}\label{structRawCanFrame_a17d18b39bed45e69f4e17ae2838f07f7}}
+\index{RawCanFrame@{RawCanFrame}!RawCanFrame@{RawCanFrame}}
+\index{RawCanFrame@{RawCanFrame}!RawCanFrame@{RawCanFrame}}
+\doxysubsubsection{\texorpdfstring{RawCanFrame()}{RawCanFrame()}}
+{\footnotesize\ttfamily Raw\+Can\+Frame\+::\+Raw\+Can\+Frame (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00028}{28}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}\label{structRawCanFrame_a2d0e7fa0e3d5c20bbed55ed8f7888ff4}}
+\index{RawCanFrame@{RawCanFrame}!canId@{canId}}
+\index{canId@{canId}!RawCanFrame@{RawCanFrame}}
+\doxysubsubsection{\texorpdfstring{canId}{canId}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Raw\+Can\+Frame\+::can\+Id}
+
+Normalized CAN ID.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00024}{24}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+\mbox{\Hypertarget{structRawCanFrame_a0acb487612104c99c9907344c035df83}\label{structRawCanFrame_a0acb487612104c99c9907344c035df83}}
+\index{RawCanFrame@{RawCanFrame}!data@{data}}
+\index{data@{data}!RawCanFrame@{RawCanFrame}}
+\doxysubsubsection{\texorpdfstring{data}{data}}
+{\footnotesize\ttfamily std\+::vector$<$std\+::uint8\+\_\+t$>$ Raw\+Can\+Frame\+::data}
+
+Payload bytes.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00026}{26}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+\mbox{\Hypertarget{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}\label{structRawCanFrame_a462193d275adc1dba8bd18ffa0e36bb7}}
+\index{RawCanFrame@{RawCanFrame}!isExtended@{isExtended}}
+\index{isExtended@{isExtended}!RawCanFrame@{RawCanFrame}}
+\doxysubsubsection{\texorpdfstring{isExtended}{isExtended}}
+{\footnotesize\ttfamily bool Raw\+Can\+Frame\+::is\+Extended}
+
+true for extended frame.
+
+Definition at line \mbox{\hyperlink{dbc__decoder_8h_source_l00025}{25}} of file \mbox{\hyperlink{dbc__decoder_8h_source}{dbc\+\_\+decoder.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decoder_8cpp_source_l00031}{Dbc\+Decoder\+::\+Decode()}}, and \mbox{\hyperlink{main_8cpp_source_l00097}{main()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{dbc__decoder_8h}{dbc\+\_\+decoder.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/structSignalInfo.tex b/docs/latex/structSignalInfo.tex
new file mode 100644
index 0000000..89b97d8
--- /dev/null
+++ b/docs/latex/structSignalInfo.tex
@@ -0,0 +1,239 @@
+\hypertarget{structSignalInfo}{}\doxysection{Signal\+Info Struct Reference}
+\label{structSignalInfo}\index{SignalInfo@{SignalInfo}}
+
+
+Describes one signal inside a DBC frame.
+
+
+
+
+{\ttfamily \#include $<$signal\+\_\+info.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structSignalInfo_aa2d2cd238118015258e271dce92a971e}{Signal\+Info}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+std\+::string \mbox{\hyperlink{structSignalInfo_a379e422a00cad56f896cacf60455b088}{name}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structSignalInfo_ace290724f9801521609aedaa946d61f1}{start\+Bit}}
+\item
+std\+::uint32\+\_\+t \mbox{\hyperlink{structSignalInfo_a1008b5201f71848177217bd52fb84baa}{length}}
+\item
+bool \mbox{\hyperlink{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}{is\+Little\+Endian}}
+\item
+bool \mbox{\hyperlink{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}{is\+Signed}}
+\item
+double \mbox{\hyperlink{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}{factor}}
+\item
+double \mbox{\hyperlink{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}{offset}}
+\item
+double \mbox{\hyperlink{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}{minimum}}
+\item
+double \mbox{\hyperlink{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}{maximum}}
+\item
+std\+::string \mbox{\hyperlink{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}{unit}}
+\item
+std\+::vector$<$ std\+::string $>$ \mbox{\hyperlink{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}{receivers}}
+\item
+std\+::string \mbox{\hyperlink{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}{comment}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Describes one signal inside a DBC frame.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00022}{22}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{structSignalInfo_aa2d2cd238118015258e271dce92a971e}\label{structSignalInfo_aa2d2cd238118015258e271dce92a971e}}
+\index{SignalInfo@{SignalInfo}!SignalInfo@{SignalInfo}}
+\index{SignalInfo@{SignalInfo}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{SignalInfo()}{SignalInfo()}}
+{\footnotesize\ttfamily Signal\+Info\+::\+Signal\+Info (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}}
+
+
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00036}{36}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}\label{structSignalInfo_ac99ba7563a5dad01e39c4257216953f5}}
+\index{SignalInfo@{SignalInfo}!comment@{comment}}
+\index{comment@{comment}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{comment}{comment}}
+{\footnotesize\ttfamily std\+::string Signal\+Info\+::comment}
+
+Optional signal comment.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00034}{34}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00274}{Dbc\+Parser\+::\+Parse\+Comment\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}\label{structSignalInfo_ae4f78d99a2750aa564d7eba860171499}}
+\index{SignalInfo@{SignalInfo}!factor@{factor}}
+\index{factor@{factor}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{factor}{factor}}
+{\footnotesize\ttfamily double Signal\+Info\+::factor}
+
+Scaling factor.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00028}{28}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}\label{structSignalInfo_af363b1563fb4c7cc8973f9a80c06846c}}
+\index{SignalInfo@{SignalInfo}!isLittleEndian@{isLittleEndian}}
+\index{isLittleEndian@{isLittleEndian}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{isLittleEndian}{isLittleEndian}}
+{\footnotesize\ttfamily bool Signal\+Info\+::is\+Little\+Endian}
+
+true for Intel, false for Motorola.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00026}{26}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}\label{structSignalInfo_a52a52b320eef92fbcb4626307f9a498f}}
+\index{SignalInfo@{SignalInfo}!isSigned@{isSigned}}
+\index{isSigned@{isSigned}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{isSigned}{isSigned}}
+{\footnotesize\ttfamily bool Signal\+Info\+::is\+Signed}
+
+true if signal is signed.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00027}{27}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_a1008b5201f71848177217bd52fb84baa}\label{structSignalInfo_a1008b5201f71848177217bd52fb84baa}}
+\index{SignalInfo@{SignalInfo}!length@{length}}
+\index{length@{length}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{length}{length}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Signal\+Info\+::length}
+
+Signal length in bits.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00025}{25}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}\label{structSignalInfo_adf1c4331b9eabced0d7fdda40ff0eb52}}
+\index{SignalInfo@{SignalInfo}!maximum@{maximum}}
+\index{maximum@{maximum}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{maximum}{maximum}}
+{\footnotesize\ttfamily double Signal\+Info\+::maximum}
+
+Maximum physical value.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00031}{31}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}\label{structSignalInfo_ada7bf94fbeaa26bd08c73982b5af255b}}
+\index{SignalInfo@{SignalInfo}!minimum@{minimum}}
+\index{minimum@{minimum}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{minimum}{minimum}}
+{\footnotesize\ttfamily double Signal\+Info\+::minimum}
+
+Minimum physical value.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00030}{30}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_a379e422a00cad56f896cacf60455b088}\label{structSignalInfo_a379e422a00cad56f896cacf60455b088}}
+\index{SignalInfo@{SignalInfo}!name@{name}}
+\index{name@{name}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{name}{name}}
+{\footnotesize\ttfamily std\+::string Signal\+Info\+::name}
+
+Signal name.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00023}{23}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}\label{structSignalInfo_ab7d0769f47aa540656b22e4e49db517e}}
+\index{SignalInfo@{SignalInfo}!offset@{offset}}
+\index{offset@{offset}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{offset}{offset}}
+{\footnotesize\ttfamily double Signal\+Info\+::offset}
+
+Physical offset.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00029}{29}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}\label{structSignalInfo_a2c95562fd0b29327a7fd7b1e6feee7f3}}
+\index{SignalInfo@{SignalInfo}!receivers@{receivers}}
+\index{receivers@{receivers}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{receivers}{receivers}}
+{\footnotesize\ttfamily std\+::vector$<$std\+::string$>$ Signal\+Info\+::receivers}
+
+Signal receivers.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00033}{33}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, and \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}.
+
+\mbox{\Hypertarget{structSignalInfo_ace290724f9801521609aedaa946d61f1}\label{structSignalInfo_ace290724f9801521609aedaa946d61f1}}
+\index{SignalInfo@{SignalInfo}!startBit@{startBit}}
+\index{startBit@{startBit}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{startBit}{startBit}}
+{\footnotesize\ttfamily std\+::uint32\+\_\+t Signal\+Info\+::start\+Bit}
+
+Start bit in DBC notation.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00024}{24}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+\mbox{\Hypertarget{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}\label{structSignalInfo_a1f214f03e94ef5794de2d3367bfcbd01}}
+\index{SignalInfo@{SignalInfo}!unit@{unit}}
+\index{unit@{unit}!SignalInfo@{SignalInfo}}
+\doxysubsubsection{\texorpdfstring{unit}{unit}}
+{\footnotesize\ttfamily std\+::string Signal\+Info\+::unit}
+
+Physical unit.
+
+Definition at line \mbox{\hyperlink{signal__info_8h_source_l00032}{32}} of file \mbox{\hyperlink{signal__info_8h_source}{signal\+\_\+info.\+h}}.
+
+
+
+Referenced by \mbox{\hyperlink{dbc__decode__builder_8cpp_source_l00014}{Dbc\+Decode\+Builder\+::\+Build()}}, \mbox{\hyperlink{dbc__parser_8cpp_source_l00181}{Dbc\+Parser\+::\+Parse\+Signal\+Line()}}, and \mbox{\hyperlink{main_8cpp_source_l00023}{Print\+Tree()}}.
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{signal__info_8h}{signal\+\_\+info.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/latex/tabu_doxygen.sty b/docs/latex/tabu_doxygen.sty
new file mode 100644
index 0000000..3f17d1d
--- /dev/null
+++ b/docs/latex/tabu_doxygen.sty
@@ -0,0 +1,2557 @@
+%%
+%% This is file `tabu.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabu.dtx (with options: `package')
+%%
+%% This is a generated file.
+%% Copyright (FC) 2010-2011 - lppl
+%%
+%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars
+%%
+%% **********************************************************************************************
+%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal
+%% \begin{tabu} to { preamble } => target specified
+%% \begin{tabu} spread { preamble } => target relative to the ``natural width''
+%%
+%% tabu works in text and in math modes.
+%%
+%% X columns: automatic width adjustment + horizontal and vertical alignment
+%% \begin{tabu} { X[4c] X[1c] X[-2ml] }
+%%
+%% Horizontal lines and / or leaders:
+%% \hline\hline => double horizontal line
+%% \firsthline\hline => for nested tabulars
+%% \lasthline\hline => for nested tabulars
+%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader)
+%% Automatic lines / leaders :
+%% \everyrow{\hline\hline}
+%%
+%% Vertical lines and / or leaders:
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] }
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] }
+%%
+%% Fixed vertical spacing adjustment:
+%% \extrarowheight= \extrarowdepth=
+%% or: \extrarowsep= => may be prefixed by \global
+%%
+%% Dynamic vertical spacing adjustment:
+%% \abovetabulinesep= \belowtabulinesep=
+%% or: \tabulinesep= => may be prefixed by \global
+%%
+%% delarray.sty shortcuts: in math and text modes
+%% \begin{tabu} .... \({ preamble }\)
+%%
+%% Algorithms reports:
+%% \tracingtabu=1 \tracingtabu=2
+%%
+%% **********************************************************************************************
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version. The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work consists of the main source file tabu.dtx
+%% and the derived files
+%% tabu.sty, tabu.pdf, tabu.ins
+%%
+%% tabu : Flexible LaTeX tabulars
+%% lppl copyright 2010-2011 by FC
+%%
+
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen]
+\RequirePackage{array}[2008/09/09]
+\RequirePackage{varwidth}[2009/03/30]
+\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined}
+\let\tabu@AtEnd\@empty
+\def\TMP@EnsureCode#1={%
+ \edef\tabu@AtEnd{\tabu@AtEnd
+ \catcode#1 \the\catcode#1}%
+ \catcode#1=%
+}% \TMP@EnsureCode
+\TMP@EnsureCode 33 = 12 % !
+\TMP@EnsureCode 58 = 12 % : (for siunitx)
+\TMP@EnsureCode124 = 12 % |
+\TMP@EnsureCode 36 = 3 % $ = math shift
+\TMP@EnsureCode 38 = 4 % & = tab alignment character
+\TMP@EnsureCode 32 = 10 % space
+\TMP@EnsureCode 94 = 7 % ^
+\TMP@EnsureCode 95 = 8 % _
+%% Constants --------------------------------------------------------
+\newcount \c@taburow \def\thetaburow {\number\c@taburow}
+\newcount \tabu@nbcols
+\newcount \tabu@cnt
+\newcount \tabu@Xcol
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcount \tabu@alloc \tabu@alloc=\m@ne
+\newcount \tabu@nested
+\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc}
+\newdimen \tabu@target
+\newdimen \tabu@spreadtarget
+\newdimen \tabu@naturalX
+\newdimen \tabucolX
+\let\tabu@DELTA \@tempdimc
+\let\tabu@thick \@tempdima
+\let\tabu@on \@tempdimb
+\let\tabu@off \@tempdimc
+\newdimen \tabu@Xsum
+\newdimen \extrarowdepth
+\newdimen \abovetabulinesep
+\newdimen \belowtabulinesep
+\newdimen \tabustrutrule \tabustrutrule \z@
+\newtoks \tabu@thebody
+\newtoks \tabu@footnotes
+\newsavebox \tabu@box
+\newsavebox \tabu@arstrutbox
+\newsavebox \tabu@hleads
+\newsavebox \tabu@vleads
+\newif \iftabu@colortbl
+\newif \iftabu@siunitx
+\newif \iftabu@measuring
+\newif \iftabu@spread
+\newif \iftabu@negcoef
+\newif \iftabu@everyrow
+\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue}
+\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse}
+\newif \iftabu@long
+\newif \iftabuscantokens
+\def\tabu@rescan {\tabu@verbatim \scantokens }
+%% Utilities (for internal usage) -----------------------------------
+\def\tabu@gobblespace #1 {#1}
+\def\tabu@gobbletoken #1#2{#1}
+\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex}
+\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble
+ \else\ifx \@sptoken\@let@token
+ \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX
+ \fi\fi
+}% \tabu@gobblex
+\def\tabu@X{^^J}
+{\obeyspaces
+\global\let\tabu@spxiii= % saves an active space (for \ifx)
+\gdef\tabu@@spxiii{ }}
+\def\tabu@ifenvir {% only for \multicolumn
+ \expandafter\tabu@if@nvir\csname\@currenvir\endcsname
+}% \tabu@ifenvir
+\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else
+ \ifx\longtabu#1first\else
+ second\fi\fi oftwo\endcsname
+}% \tabu@ifenvir
+\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi}
+{\catcode`\&=3
+\gdef\tabu@strtrim #1{% #1 = control sequence to trim
+ \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi
+ \let\tabu@c@l@r \@empty \let#1\@empty
+ \else \expandafter \tabu@trimspaces #1\@nnil
+ \fi
+}% \tabu@strtrim
+\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }%
+\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&}
+\gdef\tabu@lastspace #1{\def #3{#1}%
+ \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi
+ \tabu@trimspaces #1\@nnil}
+}% \catcode
+\def\tabu@sanitizearg #1#2{{%
+ \csname \ifcsname if@safe@actives\endcsname %
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2%
+ \expandafter}\expandafter\def\expandafter#2\expandafter{#2}%
+}% \tabu@sanitizearg
+\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}%
+ \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!!
+}% \tabu@textbar
+\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi}
+\def\tabu@everyrow@egroup{%
+ \iftabu@everyrow \expandafter \endgroup \the\toks@
+ \else \ifnum0=`{\fi}%
+ \fi
+}% \tabu@everyrow@egroup
+\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \z@}%
+}% \tabu@arstrut
+\def\tabu@rearstrut {%
+ \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax
+ \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax
+ \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima
+ \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi
+ \tabu@mkarstrut
+ \fi
+}% \tabu@rearstrut
+\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi}
+\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox
+ \hbox to\z@{\hbox to\z@{\hss
+ {\tabu@DBG{cyan}\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \z@
+ width \tabustrutrule}\kern-\tabustrutrule
+ {\tabu@DBG{pink}\vrule
+ height \z@
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \tabustrutrule}}}%
+}% \tabu@DBG@arstrut
+\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@
+ \@nextchar}}%
+\def\tabu@savedecl{\ifcat$\d@llarend\else
+ \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode
+}% \tabu@savedecl
+\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@}
+\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k }
+\let\tabu@trialh@@k \@empty
+\def\tabu@nowrite #1#{{\afterassignment}\toks@}
+\let\tabu@write\write
+\let\tabu@immediate\immediate
+\def\tabu@WRITE{\begingroup
+ \def\immediate\write{\aftergroup\endgroup
+ \tabu@immediate\tabu@write}%
+}% \tabu@WRITE
+\expandafter\def\expandafter\tabu@GenericError\expandafter{%
+ \expandafter\tabu@WRITE\GenericError}
+\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}}
+\def\tabu@noxfootnote [#1]{\@gobble}
+\def\tabu@nocolor #1#{\@gobble}
+\newcommand*\tabu@norowcolor[2][]{}
+\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}%
+ \futurelet\@let@token \tabu@m@ybesiunitx}
+\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {%
+ \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi
+ \tabu@temp}% \tabu@m@ybesiunitx
+}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname
+\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}%
+%% Fixed vertical spacing adjustment: \extrarowsep ------------------
+\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}%
+ \iftabu@everyrow \aftergroup\tabu@Gextra
+ \else \aftergroup\tabu@n@Gextra
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra
+}% \extrarowsep
+\def\tabu@extra {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setextrasep \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extra
+\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@extr@ #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extr@
+\def\tabu@setextrasep {\extrarowheight=\extrarowdepth
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+}% \tabu@setextrasep
+\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi}
+\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi}
+\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra}
+\let\tabu@C@extra \z@
+\let\tabu@G@extra \@empty
+%% Dynamic vertical spacing adjustment: \tabulinesep ----------------
+\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}%
+ \iftabu@everyrow \aftergroup\tabu@Glinesep
+ \else \aftergroup\tabu@n@Glinesep
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep
+}% \tabulinesep
+\def\tabu@linesep {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setlinesep \abovetabulinesep
+ \fi \tabu@temp}%
+}% \tabu@linesep
+\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@sets@p #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+ \fi \tabu@temp}%
+}% \tabu@sets@p
+\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+}% \tabu@setlinesep
+\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi}
+\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi}
+\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep}
+\let\tabu@C@linesep \z@
+\let\tabu@G@linesep \@empty
+%% \global\extrarowsep and \global\tabulinesep -------------------
+\def\tabu@Gsave #1#2#3#4{\xdef#1{#1%
+ \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}%
+}% \tabu@Gsave
+\def\tabu@Grestore#1#2{%
+ \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax
+ \ifcat$\the\toks\currentgrouplevel$\else
+ \global\let#1\@empty \global\let#2\z@
+ \the\toks\currentgrouplevel
+ \fi
+}% \tabu@Grestore
+%% Setting code for every row ---------------------------------------
+\newcommand*\everyrow{\tabu@everyrow@bgroup
+ \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop
+}% \everyrow
+\def\tabu@evrstartstop {\@ifnextchar^%
+ {\afterassignment \tabu@evrstartstop \tabu@stop=}%
+ {\ifx ^\@let@token
+ \afterassignment\tabu@evrstartstop \tabu@start=%
+ \else \afterassignment\tabu@everyr@w \toks@
+ \fi}%
+}% \tabu@evrstartstop
+\def\tabu@everyr@w {%
+ \xdef\tabu@everyrow{%
+ \noexpand\tabu@everyrowfalse
+ \let\noalign \relax
+ \noexpand\tabu@rowfontreset
+ \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors
+ \let\noexpand\tabu@docline \noexpand\tabu@docline@evr
+ \the\toks@
+ \noexpand\tabu@evrh@@k
+ \noexpand\tabu@rearstrut
+ \global\advance\c@taburow \@ne}%
+ \iftabu@everyrow \toks@\expandafter
+ {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}%
+ \else \xdef\tabu@evr@G{\the\toks@}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@everyr@w
+\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only
+\tabu@evr{}
+%% line style and leaders -------------------------------------------
+\newcommand*\newtabulinestyle [1]{%
+ {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}%
+}% \newtabulinestyle
+\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}%
+ \tabu@sanitizearg {#1}\@tempa
+ \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi
+ \global\expandafter\let
+ \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi
+}% \tabu@newlinestyle
+\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}%
+ \iftabu@everyrow
+ \toks@\expandafter{\expandafter \def \expandafter
+ \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}%
+ \gdef\tabu@ls@{\tabu@ls@L}%
+ \else
+ \global\let\tabu@ls@G \tabu@thestyle
+ \gdef\tabu@ls@{\tabu@ls@G}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabulinestyle
+\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor}
+\def\tabu@rulecolor #1{\toks@{}%
+ \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1%
+ \tabu@temp
+ \tabu@rulearc
+}% \tabu@rulecolor
+\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp
+ \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}%
+ \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}%
+ \fi
+ \tabu@temp
+}% \tabu@ruledrsc@
+\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}}
+\def\tabu@rule@drsc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}%
+ \else \toks@{\def\CT@drsc@{\color #1{#2}}}%
+ \fi
+ \else
+ \ifx \\#1#2\\\global\let\CT@drsc@ \relax
+ \else \gdef\CT@drsc@{\color #1{#2}}%
+ \fi
+ \fi
+ \tabu@rulearc
+}% \tabu@rule@drsc@
+\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}}
+\def\tabu@rule@arc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}%
+ \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}%
+ \fi
+ \toks@\expandafter{\the\toks@
+ \let\tabu@arc@L \CT@arc@
+ \let\tabu@drsc@L \CT@drsc@
+ \ignorespaces}%
+ \else
+ \ifx \\#1#2\\\gdef\CT@arc@{}%
+ \else \gdef\CT@arc@{\color #1{#2}}%
+ \fi
+ \global\let\tabu@arc@G \CT@arc@
+ \global\let\tabu@drsc@G \CT@drsc@
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rule@arc@
+\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1}
+\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}}
+\def\tabu@rowc@lors #1#2#3{%
+ \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil
+ \@defaultunits \tabu@start =\number0#1\relax \@nnil
+ \ifnum \count@<\tw@ \count@=\tw@ \fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start<\z@ \tabu@start \z@ \fi
+ \tabu@rowcolorseries #3\in@..\in@ \@nnil
+}% \tabu@rowcolors
+\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {%
+ \ifx \in@#1\relax
+ \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}%
+ \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \else
+ \ifx \\#2\\\tabu@rowcolorserieserror \fi
+ \tabu@sanitizearg{#1}\tabu@temp
+ \tabu@sanitizearg{#2}\@tempa
+ \advance\count@ \m@ne
+ \iftabu@everyrow
+ \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{%
+ \ifnum ##2=\c@taburow
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi
+ \ifnum \c@taburow<##2 \else
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}\fi}%
+ }\edef\x{\noexpand\tabu@rc@ {\the\count@}
+ {\the\tabu@start}
+ {\tabu@temp}
+ {\@tempa}%
+ }\x
+ \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}%
+ \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}%
+ \else % inside \noalign
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}%
+ \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}%
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}%
+ \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{%
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}}%
+ }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x
+ \global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rowcolorseries
+\tabuDisableCommands {\let\tabu@rc@ \@empty }
+\def\tabu@rowcolorserieserror {\PackageError{tabu}
+ {Invalid syntax for \string\taburowcolors
+ \MessageBreak Please look at the documentation!}\@ehd
+}% \tabu@rowcolorserieserror
+\newcommand*\tabureset {%
+ \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@
+ \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}%
+}% \tabureset
+%% Parsing the line styles ------------------------------------------
+\def\tabu@getline #1{\begingroup
+ \csname \ifcsname if@safe@actives\endcsname %
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa
+ \let\tabu@thestyle \relax
+ \ifcsname tabu@linestyle@\@tempa \endcsname
+ \edef\tabu@thestyle{\endgroup
+ \def\tabu@thestyle{\expandafter\noexpand
+ \csname tabu@linestyle@\@tempa\endcsname}%
+ }\tabu@thestyle
+ \else \expandafter\tabu@definestyle \tabu@temp \@nil
+ \fi
+}% \tabu@getline
+\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter
+ \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen
+ \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined
+ \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs
+ \def\tabu@temp{\tabu@getparam{thick}}%
+ \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}%
+ \fi
+ {%
+ \let\tabu@ \relax
+ \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-))
+ \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}%
+ \expandafter}\expandafter
+ \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-)
+ \def\;{\def\:}%
+ \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10)
+ \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-)
+ \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi
+ \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi
+ \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi
+ \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen
+ \tabu@on \tabulineon \fi\fi
+ \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen
+ \tabu@off \tabulineoff \fi\fi
+ \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi
+ \in@true %
+ \else \in@false %
+ \fi
+ \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}%
+ \else \edef\tabu@thick{\the\tabu@thick}%
+ \fi
+ \edef \tabu@thestyle ##1##2{\endgroup
+ \def\tabu@thestyle{%
+ \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick}
+ {\the\tabu@on}{##1}
+ {\the\tabu@off}{##2}%
+ \else \noexpand\tabu@rulesstyle
+ {##1\vrule width \tabu@thick}%
+ {##1\leaders \hrule height \tabu@thick \hfil}%
+ \fi}%
+ }\expandafter \expandafter
+ \expandafter \tabu@thestyle \expandafter
+ \expandafter \expandafter
+ {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}%
+}% \tabu@definestyle
+{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active
+ \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}}
+ \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space}
+}% \catcode
+\def\tabu@oxiii #1{%
+ \ifcase \ifx n#1\z@ \else
+ \ifx f#1\@ne\else
+ \tw@ \fi\fi
+ \expandafter\tabu@onxiii
+ \or \expandafter\tabu@ofxiii
+ \else o%
+ \fi#1}%
+\def\tabu@onxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx \tabu@spxiii#2\@ne\else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{on}#2\expandafter\@gobble
+ \or \expandafter\tabu@onxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}%
+\def\tabu@ofxiii #1#2{%
+ \ifx #2f\expandafter\tabu@offxiii
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@offxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx\tabu@spxiii#2\@ne \else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{off}#2\expandafter\@gobble
+ \or \expandafter\tabu@offxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=}
+\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef
+ \ifx \tabu@#1\else % no more spec
+ \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi
+}% \tabu@getcolor
+\def\tabu@getc@l@r #1\tabu@ {%
+ \def\tabu@temp{#1}\tabu@strtrim \tabu@temp
+ \ifx \tabu@temp\@empty
+ \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists
+ \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r
+ \else \let\tabu@c@lon \tabu@c@l@r
+ \fi
+ %\else \tabu@warncolour{\tabu@temp}%
+ \fi%\fi
+ \tabu@ % next spec
+}% \tabu@getc@l@r
+\def\tabu@warncolour #1{\PackageWarning{tabu}
+ {Color #1 is not defined. Default color used}%
+}% \tabu@warncolour
+\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}%
+ \ifx \tabu@leaders\tabu@leaders@G \else
+ \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi
+}% \tabu@leadersstyle
+\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined
+ \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}%
+}% \tabu@rulesstyle
+%% The leaders boxes ------------------------------------------------
+\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor
+ {% % but the leaders boxes should have colors !
+ \def\@therule{\vrule}\def\@thick{height}\def\@length{width}%
+ \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}%
+ \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thehleaders \tabu@theleaders
+ }%
+ {%
+ \def\@therule{\hrule}\def\@thick{width}\def\@length{height}%
+ \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}%
+ \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thevleaders \tabu@theleaders
+ }%
+ \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}%
+ }%
+}% \tabu@LEADERS
+\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@}
+\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ \global\setbox \tabu@leads=\@box{%
+ {#3\tabu@therule{#1}{#2}}%
+ \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi
+ {#3\tabu@therule{#1}{#2}}}%
+ \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss
+ {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}%
+ \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {%
+ {##1\tabu@therule{#1}{#2}}%
+ \xleaders \copy\tabu@leads \@ss
+ \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}%
+ }\tabu@theleaders{#3}%
+}% \tabu@l@@d@rs
+%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ----------
+\newcommand*\tabu {\tabu@longfalse
+ \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}%
+ \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endtabu*\endcsname{\endtabu}%
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {tabu}
+\let\tabu@tabular \tabular %
+\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu}
+\newcommand*\longtabu {\tabu@longtrue
+ \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi
+ \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}%
+ \LTchunksize=\@M
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}%
+ \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts }
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {longtabu}
+\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu}
+\def\tabu@nolongtabu{\PackageError{tabu}
+ {longtabu requires the longtable package}\@ehd}
+%% Read the target and then : \tabular or \@array ------------------
+\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget }
+\def\tabu@sett@rget {\tabu@target \z@
+ \ifcase \ifx \bgroup\@let@token \z@ \else
+ \ifx \@sptoken\@let@token \@ne \else
+ \if t\@let@token \tw@ \else
+ \if s\@let@token \thr@@\else
+ \z@\fi\fi\fi\fi
+ \expandafter\tabu@begin
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget
+ \or \expandafter\tabu@to
+ \or \expandafter\tabu@spread
+ \fi
+}% \tabu@sett@rget
+\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget}
+\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget}
+\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target }
+\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget }
+\def\tabu@linegoalt@rget {%
+ \ifx \tabu@temp\LNGL@setlinegoal
+ \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal
+ \tabu@begin
+}% \tabu@linegoalt@rget
+\def\tabu@begin #1#{%
+ \iftabu@measuring \expandafter\tabu@nestedmeasure \fi
+ \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty
+ \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}%
+ \fi
+ \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil
+}% \tabu@begin
+\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup
+ \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}%
+ \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }%
+}% \tabu@tabu@
+\def\tabu@nestedmeasure {%
+ \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax
+ \tabu@spreadtrue
+ \else \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}%
+ \expandafter\tabu@collectbody\expandafter\tabu@quickrule
+ \expandafter\endgroup
+ \fi
+}% \tabu@nestedmeasure
+\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target}
+%% \tabu@setup \tabu@init \tabu@indent
+\def\tabu@setup{\tabu@alloc@
+ \ifcase \tabu@nested
+ \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@
+ \let\tabu@afterendpar \par
+ \fi\fi\fi
+ \def\tabu@aligndefault{c}\tabu@init \tabu@indent
+ \else %
+ \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth
+ \fi
+ \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined
+ \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}%
+ \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu...
+ \let\@endpbox \tabu@endpbox % idem " " " " " "
+ \let\@tabarray \tabu@tabarray % idem " " " " " "
+ \tabu@setcleanup \tabu@setreset
+}% \tabu@setup
+\def\tabu@init{\tabu@starttimer \tabu@measuringfalse
+ \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}%
+ \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline
+ \let\firstline \tabu@firstline \let\lastline \tabu@lastline
+ \let\hline \tabu@hline \let\@xhline \tabu@xhline
+ \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox
+ \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi
+ \tabu@trivlist %
+ \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext
+ \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering
+ \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft
+ \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering
+ \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft
+ \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont
+ \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x
+ \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar
+ \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok
+ \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn
+ \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!!
+ \let\tabu@endpbox \@endpbox % idem " " " " " " "
+ \let\tabu@tabarray \@tabarray % idem " " " " " " "
+ \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray)
+ \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi
+}% \tabu@init
+\def\tabu@indent{% correction for indentation
+ \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget
+ \everypar\expandafter{%
+ \the\everypar\everypar\expandafter{\the\everypar}%
+ \setbox\z@=\lastbox
+ \ifdim\wd\z@>\z@ \edef\tabu@thetarget
+ {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi
+ \box\z@}%
+ \fi\fi
+}% \tabu@indent
+\def\tabu@setcleanup {% saves last global assignments
+ \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax
+ \def\tabu@aftergroupcleanup{%
+ \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}%
+ \else
+ \def\tabu@aftergroupcleanup{%
+ \aftergroup\aftergroup\aftergroup\tabu@cleanup
+ \let\tabu@aftergroupcleanup \relax}%
+ \fi
+ \let\tabu@arc@Gsave \tabu@arc@G
+ \let\tabu@arc@G \tabu@arc@L %
+ \let\tabu@drsc@Gsave \tabu@drsc@G
+ \let\tabu@drsc@G \tabu@drsc@L %
+ \let\tabu@ls@Gsave \tabu@ls@G
+ \let\tabu@ls@G \tabu@ls@L %
+ \let\tabu@rc@Gsave \tabu@rc@G
+ \let\tabu@rc@G \tabu@rc@L %
+ \let\tabu@evr@Gsave \tabu@evr@G
+ \let\tabu@evr@G \tabu@evr@L %
+ \let\tabu@celllalign@save \tabu@celllalign
+ \let\tabu@cellralign@save \tabu@cellralign
+ \let\tabu@cellleft@save \tabu@cellleft
+ \let\tabu@cellright@save \tabu@cellright
+ \let\tabu@@celllalign@save \tabu@@celllalign
+ \let\tabu@@cellralign@save \tabu@@cellralign
+ \let\tabu@@cellleft@save \tabu@@cellleft
+ \let\tabu@@cellright@save \tabu@@cellright
+ \let\tabu@rowfontreset@save \tabu@rowfontreset
+ \let\tabu@@rowfontreset@save\tabu@@rowfontreset
+ \let\tabu@rowfontreset \@empty
+ \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset
+ \edef\c@taburow@save {\the\c@taburow}%
+ \edef\tabu@naturalX@save {\the\tabu@naturalX}%
+ \let\tabu@naturalXmin@save \tabu@naturalXmin
+ \let\tabu@naturalXmax@save \tabu@naturalXmax
+ \let\tabu@mkarstrut@save \tabu@mkarstrut
+ \edef\tabu@clarstrut{%
+ \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax
+ \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax
+ \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}%
+}% \tabu@setcleanup
+\def\tabu@cleanup {\begingroup
+ \globaldefs\@ne \tabu@everyrowtrue
+ \let\tabu@arc@G \tabu@arc@Gsave
+ \let\CT@arc@ \tabu@arc@G
+ \let\tabu@drsc@G \tabu@drsc@Gsave
+ \let\CT@drsc@ \tabu@drsc@G
+ \let\tabu@ls@G \tabu@ls@Gsave
+ \let\tabu@ls@ \tabu@ls@G
+ \let\tabu@rc@G \tabu@rc@Gsave
+ \let\tabu@rc@ \tabu@rc@G
+ \let\CT@do@color \relax
+ \let\tabu@evr@G \tabu@evr@Gsave
+ \let\tabu@celllalign \tabu@celllalign@save
+ \let\tabu@cellralign \tabu@cellralign@save
+ \let\tabu@cellleft \tabu@cellleft@save
+ \let\tabu@cellright \tabu@cellright@save
+ \let\tabu@@celllalign \tabu@@celllalign@save
+ \let\tabu@@cellralign \tabu@@cellralign@save
+ \let\tabu@@cellleft \tabu@@cellleft@save
+ \let\tabu@@cellright \tabu@@cellright@save
+ \let\tabu@rowfontreset \tabu@rowfontreset@save
+ \let\tabu@@rowfontreset \tabu@@rowfontreset@save
+ \tabu@naturalX =\tabu@naturalX@save
+ \let\tabu@naturalXmax \tabu@naturalXmax@save
+ \let\tabu@naturalXmin \tabu@naturalXmin@save
+ \let\tabu@mkarstrut \tabu@mkarstrut@save
+ \c@taburow =\c@taburow@save
+ \ifcase \tabu@nested \tabu@alloc \m@ne\fi
+ \endgroup %
+ \ifcase \tabu@nested
+ \the\tabu@footnotes \global\tabu@footnotes{}%
+ \tabu@afterendpar \tabu@elapsedtime
+ \fi
+ \tabu@clarstrut
+ \everyrow\expandafter {\tabu@evr@G}%
+}% \tabu@cleanup
+\let\tabu@afterendpar \relax
+\def\tabu@setreset {%
+ \edef\tabu@savedparams {% \relax for \tabu@message@save
+ \ifmmode \col@sep \the\arraycolsep
+ \else \col@sep \the\tabcolsep \fi \relax
+ \arrayrulewidth \the\arrayrulewidth \relax
+ \doublerulesep \the\doublerulesep \relax
+ \extratabsurround \the\extratabsurround \relax
+ \extrarowheight \the\extrarowheight \relax
+ \extrarowdepth \the\extrarowdepth \relax
+ \abovetabulinesep \the\abovetabulinesep \relax
+ \belowtabulinesep \the\belowtabulinesep \relax
+ \def\noexpand\arraystretch{\arraystretch}%
+ \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}%
+ \begingroup
+ \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu
+ \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi
+ \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi
+ \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L
+ \expandafter \endgroup \expandafter
+ \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena
+ \let\tabu@arc@G \tabu@arc@L
+ \let\tabu@drsc@G \tabu@drsc@L
+ \let\tabu@ls@G \tabu@ls@L
+ \let\tabu@rc@G \tabu@rc@L
+ \let\tabu@evr@G \tabu@evr@L}%
+ \def\tabu@reset{\tabu@savedparams
+ \tabu@everyrowtrue \c@taburow \z@
+ \let\CT@arc@ \tabu@arc@L
+ \let\CT@drsc@ \tabu@drsc@L
+ \let\tabu@ls@ \tabu@ls@L
+ \let\tabu@rc@ \tabu@rc@L
+ \global\tabu@alloc \tabu@alloc@save
+ \everyrow\expandafter{\tabu@evr@L}}%
+}% \tabu@reset
+\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}}
+\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}}
+%% The Rewriting Process -------------------------------------------
+\def\tabu@newcolumntype #1{%
+ \expandafter\tabu@new@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@newcolumntype
+\def\tabu@new@columntype #1#2#3{%
+ \def#1##1#3{\NC@{##1}}%
+ \let#2\relax \newcommand*#2%
+}% \tabu@new@columntype
+\def\tabu@privatecolumntype #1{%
+ \expandafter\tabu@private@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\expandafter\endcsname
+ \csname tabu@NC@find@\string#1\expandafter\endcsname
+ \csname tabu@NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@privatecolumntype
+\def\tabu@private@columntype#1#2#3#4{%
+ \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}%
+ \tabu@new@columntype#3#4%
+}% \tabu@private@columntype
+\let\tabu@privatecolumns \@empty
+\newcommand*\tabucolumn [1]{\expandafter \def \expandafter
+ \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns
+ \NC@do #1}}%
+\let\tabu@highprioritycolumns \@empty
+%% The | ``column'' : rewriting process --------------------------
+\tabu@privatecolumntype |{\tabu@rewritevline}
+\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}%
+ \expandafter \NC@find \tabu@rewritten}
+\def\tabu@lines #1{%
+ \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi
+ \NC@list\expandafter{\the\NC@list \NC@do #1}%
+}% \tabu@lines@
+\def\tabu@vlinearg #1{%
+ \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}%
+ \else\tabu@getline {#1}%
+ \fi
+ \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}%
+ }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}%
+ \expandafter \tabu@keepls \tabu@thestyle \@nil
+}% \tabu@vlinearg
+\def\tabu@keepls #1\@nil{%
+ \ifcat $\@cdr #1\@nil $%
+ \ifx \relax#1\else
+ \ifx \tabu@ls@#1\else
+ \let#1\relax
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@savels\noexpand#1}\fi\fi\fi
+}% \tabu@keepls
+\def\tabu@thevline {\begingroup
+ \ifdefined\tabu@leaders
+ \setbox\@tempboxa=\vtop to\dimexpr
+ \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}%
+ \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox
+ \box\@tempboxa
+ \else
+ \tabu@thevrule
+ \fi \endgroup
+}% \tabu@thevline
+\def\tabu@savels #1{%
+ \expandafter\let\csname\string#1\endcsname #1%
+ \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset
+ \tabu@resetls#1}}%
+\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}%
+%% \multicolumn inside tabu environment -----------------------------
+\tabu@newcolumntype \tabu@rewritemulticolumn{%
+ \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}%
+ \let\tabu@savels \relax
+ \NC@find
+}% \tabu@rewritemulticolumn
+\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup}
+\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI}
+\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup
+ \tabu@everyrowtrue
+ \NC@list{\NC@do \tabu@rewritemulticolumn}%
+ \expandafter\@gobbletwo % gobbles \multispan{#1}
+ \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}%
+ {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi
+ {#3}}%
+}% \tabu@multic@lumn
+%% The X column(s): rewriting process -----------------------------
+\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}}
+\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten }
+\def\tabu@siunitx #1{\@ifnextchar \bgroup
+ {\tabu@rewriteX@Ss{#1}}
+ {\tabu@nosiunitx{#1}}}
+\def\tabu@rewriteX@Ss #1#2{\@temptokena{}%
+ \@defaultunits \let\tabu@temp =#2\relax\@nnil
+ \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi
+ \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}%
+ }\expandafter\NC@find \the\@temptokena \relax
+ }\expandafter\NC@rewrite@S \@gobble #2\relax
+ \else \tabu@siunitxerror
+ \fi
+ \expandafter \NC@find \tabu@rewritten
+}% \tabu@rewriteX@Ss
+\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column !
+ \MessageBreak X column can only embed siunitx S or s columns}\@ehd
+}% \tabu@siunitxerror
+\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}%
+ \iftabu@measuring
+ \else \tabu@measuringtrue % first X column found in the preamble
+ \let\@halignto \relax \let\tabu@halignto \relax
+ \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@
+ \else \tabu@spreadtarget \z@ \fi
+ \ifdim \tabu@target=\z@
+ \setlength\tabu@target \tabu@thetarget
+ \tabu@message{\tabu@message@defaulttarget}%
+ \else \tabu@message{\tabu@message@target}\fi
+ \fi
+}% \tabu@rewriteX
+\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax
+ \def\tabu@rewritten{l}}
+\def\tabu@Xarg #1#2#3{%
+ \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty
+ \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty
+ \ifx\\#1\\%
+ \def\tabu@rewritten{p}\tabucolX \p@ %
+ \else
+ \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@
+ \tabu@Xparse {}#1\relax
+ \fi
+ \tabu@Xrewritten{#2}{#3}%
+}% \tabu@Xarg
+\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest}
+\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}}
+\def\tabu@Xtest{%
+ \ifcase \ifx \relax\@let@token \z@ \else
+ \if ,\@let@token \m@ne\else
+ \if p\@let@token 1\else
+ \if m\@let@token 2\else
+ \if b\@let@token 3\else
+ \if l\@let@token 4\else
+ \if c\@let@token 5\else
+ \if r\@let@token 6\else
+ \if j\@let@token 7\else
+ \if L\@let@token 8\else
+ \if C\@let@token 9\else
+ \if R\@let@token 10\else
+ \if J\@let@token 11\else
+ \ifx \@sptoken\@let@token 12\else
+ \if .\@let@token 13\else
+ \if -\@let@token 13\else
+ \ifcat $\@let@token 14\else
+ 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \or \tabu@Xtype {p}%
+ \or \tabu@Xtype {m}%
+ \or \tabu@Xtype {b}%
+ \or \tabu@Xalign \raggedright\relax
+ \or \tabu@Xalign \centering\relax
+ \or \tabu@Xalign \raggedleft\relax
+ \or \tabu@Xalign \tabu@justify\relax
+ \or \tabu@Xalign \RaggedRight\raggedright
+ \or \tabu@Xalign \Centering\centering
+ \or \tabu@Xalign \RaggedLeft\raggedleft
+ \or \tabu@Xalign \justifying\tabu@justify
+ \or \expandafter \tabu@Xparsespace
+ \or \expandafter \tabu@Xcoef
+ \or \expandafter \tabu@Xm@th
+ \or \tabu@Xcoef{}%
+ \else\expandafter \tabu@Xparse
+ \fi
+}% \tabu@Xtest
+\def\tabu@Xalign #1#2{%
+ \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu}
+ {Duplicate horizontal alignment specification}\fi
+ \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax
+ \else \def\tabu@Xlcr{#2}\let#2\relax\fi
+ \expandafter\tabu@Xparse
+}% \tabu@Xalign
+\def\tabu@Xtype #1{%
+ \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu}
+ {Duplicate vertical alignment specification}\fi
+ \def\tabu@rewritten{#1}\expandafter\tabu@Xparse
+}% \tabu@Xtype
+\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}%
+ \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi
+}% \tabu@Xcoef
+\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@
+ \tabu@Xparse{}%
+}% \tabu@Xc@ef
+\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp}
+\def\tabu@Xd@sp{\let\tabu@Xmath=$%
+ \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}%
+ \expandafter\tabu@Xparse
+ \else \expandafter\tabu@Xparse\expandafter{\expandafter}%
+ \fi
+}% \tabu@Xd@sp
+\def\tabu@Xrewritten {%
+ \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi
+ \ifdim \tabucolX<\z@ \tabu@negcoeftrue
+ \else\ifdim \tabucolX=\z@ \tabucolX \p@
+ \fi\fi
+ \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}%
+ \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}%
+ \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{%
+ >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}%
+ \tabu@rewritten {\tabu@hsize \tabu@temp}%
+ <{##2\ifx$\tabu@Xmath$\fi}}%
+ }\tabu@rewritten
+}% \tabu@Xrewritten
+\def\tabu@hsize #1#2{%
+ \ifdim #2\p@<\z@
+ \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else
+ \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi
+ \fi
+ \else #2\tabucolX
+ \fi
+}% \tabu@hsize
+%% \usetabu and \preamble: rewriting process ---------------------
+\tabu@privatecolumntype \usetabu [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\let\tabu@rewriteX \tabu@rewriteXrestore
+ \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}%
+ \fi
+}% \NC@rewrite@\usetabu
+\tabu@privatecolumntype \preamble [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}%
+ \fi
+}% \NC@rewrite@\preamble
+%% Controlling the rewriting process -------------------------------
+\tabu@newcolumntype \tabu@rewritefirst{%
+ \iftabu@long \aftergroup \tabu@longpream %
+ \else \aftergroup \tabu@pream
+ \fi
+ \let\tabu@ \relax \let\tabu@hsize \relax
+ \let\tabu@Xcoefs \@empty \let\tabu@savels \relax
+ \tabu@Xcol \z@ \tabu@cnt \tw@
+ \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse
+ \global\setbox\@arstrutbox \box\@arstrutbox
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \NC@list\expandafter{\the\NC@list \NC@do X}%
+ \iftabu@siunitx %
+ \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}%
+ \expandafter\def\expandafter\tabu@NC@list\expandafter{%
+ \the\expandafter\NC@list \tabu@NC@list}% % * | X S
+ \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu
+ \expandafter \NC@do \expandafter\preamble
+ \the\NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle
+}% NC@rewrite@\tabu@rewritefirst
+\tabu@newcolumntype \tabu@rewritemiddle{%
+ \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast
+}% \NC@rewrite@\tabu@rewritemiddle
+\tabu@newcolumntype \tabu@rewritelast{%
+ \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne
+ \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \else \let\tabu@prev\tabu@temp
+ \fi
+ \ifcase \tabu@cnt \expandafter\tabu@endrewrite
+ \else \expandafter\NC@find \expandafter\tabu@rewritemiddle
+ \fi
+}% \NC@rewrite@\tabu@rewritelast
+%% Choosing the strategy --------------------------------------------
+\def\tabu@endrewrite {%
+ \let\tabu@temp \NC@find
+ \ifx \@arrayright\relax \let\@arrayright \@empty \fi
+ \count@=%
+ \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print
+ \iftabu@measuring
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@target \csname tabu@\the\tabu@nested.T\endcsname
+ \tabucolX \csname tabu@\the\tabu@nested.X\endcsname
+ \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}%
+ \fi
+ \else\iftabu@measuring 4 % X columns
+ \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer
+ \tabu@target \the\tabu@target
+ \tabu@spreadtarget \the\tabu@spreadtarget}%
+ \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}%
+ \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}%
+ \let\tabu@Xcoefs \relax
+ \else\ifcase\tabu@nested \thr@@ % outer, no X
+ \global\let\tabu@afterendpar \relax
+ \else \@ne % inner, no X, outer in mode 1 or 2
+ \fi
+ \ifdefined\tabu@usetabu
+ \else \ifdim\tabu@target=\z@
+ \else \let\tabu@temp \tabu@extracolsep
+ \fi\fi
+ \fi
+ \fi
+ \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}%
+ \tabu@temp
+}% \tabu@endrewrite
+\def\tabu@extracolsep{\@defaultunits \expandafter\let
+ \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil
+ \ifx \tabu@temp\@sptoken
+ \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep
+ \else
+ \edef\tabu@temp{\noexpand\NC@find
+ \if |\noexpand\tabu@temp @%
+ \else\if !\noexpand\tabu@temp @%
+ \else !%
+ \fi\fi
+ {\noexpand\extracolsep\noexpand\@flushglue}}%
+ \fi
+ \tabu@temp
+}% \tabu@extrac@lsep
+%% Implementing the strategy ----------------------------------------
+\long\def\tabu@pream #1\@preamble {%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\tabu@aftergroupcleanup}%
+ \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody
+ \@preamble}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@pream
+\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@longpream
+\def\tabu@select {%
+ \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi
+ \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi
+ \ifcase \count@
+ \global\let\tabu@elapsedtime \relax
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble % vertical adjustment (inherited from outer)
+ \or % exit in vertical measure + struts per cell because no X and outer in mode 3
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \or % exit without measure because no X and outer in mode 4
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \else % needs trials
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@savecounters
+ \expandafter \tabu@setstrategy
+ \fi
+}% \tabu@select
+\def\tabu@@ {\gdef\tabu@mkpreambuffer}
+%% Protections to set up before trials ------------------------------
+\def\tabu@setstrategy {\begingroup %
+ \tabu@trialh@@k \tabu@cnt \z@ % number of trials
+ \hbadness \@M \let\hbadness \@tempcnta
+ \hfuzz \maxdimen \let\hfuzz \@tempdima
+ \let\write \tabu@nowrite\let\GenericError \tabu@GenericError
+ \let\savetabu \@gobble \let\tabudefaulttarget \linewidth
+ \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote
+ \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor
+ \let\tabu@aftergroupcleanup \relax % only after the last trial
+ \tabu@mkpreambuffer
+ \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init
+ \def\tabu@lasttry{\m@ne\p@}\fi
+ \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi %
+ \tabu@collectbody \tabu@strategy %
+}% \tabu@setstrategy
+\def\tabu@savecounters{%
+ \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}%
+ \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax
+}% \tabu@savecounters
+\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0)
+ \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs
+ \ifdim \dimen@>\z@
+ \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \fi
+}% \tabucolX@init
+\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum
+ \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@
+ \else -#2\p@ \tabu@negcoeftrue
+ \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \tabu@wddef{#1}{0pt}%
+ \fi
+}% \tabu@Xinit
+%% Collecting the environment body ----------------------------------
+\long\def\tabu@collectbody #1#2\end #3{%
+ \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}%
+ \ifx \tabu@stack\@empty
+ \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}%
+ \def\tabu@end@envir{\end{#3}}%
+ \iftabuscantokens
+ \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}%
+ \else \def\tabu@endenvir {\let\endarray \@empty
+ \end{#3}\tabu@gobbleX}%
+ \fi
+ \else \def\tabu@endenvir {\end{#3}}\fi}%
+ \let\tabu@collectbody \tabu@endofcollect
+ \else\def\tabu@temp{#3}%
+ \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }%
+ \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \toks@\expandafter{\the\toks@ #2\end{#3}}%
+ \fi\fi\fi
+ \fi
+ \tabu@collectbody{#1}%
+}% \tabu@collectbody
+\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}%
+\def\tabu@endofcollect #1{\ifnum0=`{}\fi
+ \expandafter\endgroup \the\toks@ #1%
+}% \tabu@endofcollect
+%% The trials: switching between strategies -------------------------
+\def\tabu@strategy {\relax % stops \count@ assignment !
+ \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished)
+ \expandafter \tabu@endoftrials
+ \or % case 1 = exit in vertical measure (outer in mode 3)
+ \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}%
+ \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}%
+ \expandafter \tabu@endoftrials
+ \or % case 2 = exit with a rule replacing the table (outer in mode 4)
+ \expandafter \tabu@quickend
+ \or % case 3 = outer is in mode 3 because of no X
+ \begingroup
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \expandafter \tabu@measuring
+ \else % case 4 = horizontal measure
+ \begingroup
+ \global\let\tabu@elapsedtime \tabu@message@etime
+ \long\def\multicolumn##1##2##3{\multispan{##1}}%
+ \let\tabu@startpboxORI \@startpbox
+ \iftabu@spread
+ \def\tabu@naturalXmax {\z@}%
+ \let\tabu@naturalXmin \tabu@naturalXmax
+ \tabu@evr{\global\tabu@naturalX \z@}%
+ \let\@startpbox \tabu@startpboxmeasure
+ \else\iftabu@negcoef
+ \let\@startpbox \tabu@startpboxmeasure
+ \else \let\@startpbox \tabu@startpboxquick
+ \fi\fi
+ \expandafter \tabu@measuring
+ \fi
+}% \tabu@strategy
+\def\tabu@measuring{\expandafter \tabu@trial \expandafter
+ \count@ \the\count@ \tabu@endtrial
+}% \tabu@measuring
+\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi}
+\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \csname tabu@adl@endtrial\endcsname
+ \endarray}$\egroup % got \tabu@box
+}% \tabu@shorttrial
+\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \tabuendlongtrial}\egroup % got \tabu@box
+}% \tabu@longtrial
+\def\tabuendlongtrial{% no @ allowed for \scantokens
+ \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne
+ \LT@get@widths
+}% \tabuendlongtrial
+\def\tabu@adl@endtrial{%
+ \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails !
+\def\tabu@seteverycr {\tabu@reset
+ \everycr \expandafter{\the\everycr \tabu@everycr}%
+ \let\everycr \tabu@noeverycr %
+}% \tabu@seteverycr
+\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@}
+\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr}
+\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi}
+\def\tabu@endoftrials {%
+ \iftabuscantokens \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\expandafter \tabu@closetrialsgroup \expandafter
+ \tabu@rescan \expandafter{%
+ \expandafter\tabuthepreamble
+ \the\expandafter\tabu@thebody
+ \iftabu@long \else \endarray \fi}}
+ {\expandafter\tabu@closetrialsgroup \expandafter
+ \tabuthepreamble
+ \the\tabu@thebody}%
+ \tabu@endenvir % Finish !
+}% \tabu@endoftrials
+\def\tabu@closetrialsgroup {%
+ \toks@\expandafter{\tabu@endenvir}%
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target
+ \tabu@cnt \the\tabu@cnt
+ \def\noexpand\tabu@endenvir{\the\toks@}%
+ %Quid de \@halignto = \tabu@halignto ??
+ }% \tabu@bufferX
+ \tabu@bufferX
+ \ifcase\tabu@nested % print out (outer in mode 0)
+ \global\tabu@cnt \tabu@cnt
+ \tabu@evr{\tabu@verticaldynamicadjustment}%
+ \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty
+ \let\@finalstrut \tabu@finalstrut
+ \else % vertical measure of nested tabu
+ \tabu@evr{\tabu@verticalinit}%
+ \tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \fi
+ \tabu@clckpt \let\@halignto \tabu@halignto
+ \let\@halignto \@empty
+ \tabu@seteverycr
+ \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@
+ \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts)
+ \fi\fi
+}% \tabu@closetrialsgroup
+\def\tabu@quickend {\expandafter \endgroup \expandafter
+ \tabu@target \the\tabu@target \tabu@quickrule
+ \let\endarray \relax \tabu@endenvir
+}% \tabu@quickend
+\def\tabu@endtrial {\relax % stops \count@ assignment !
+ \ifcase \count@ \tabu@err % case 0 = impossible here
+ \or \tabu@err % case 1 = impossible here
+ \or \tabu@err % case 2 = impossible here
+ \or % case 3 = outer goes into mode 0
+ \def\tabu@bufferX{\endgroup}\count@ \z@
+ \else % case 4 = outer goes into mode 3
+ \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3)
+ \else \tabu@arith % or 2 (outer in mode 4)
+ \fi
+ \count@=%
+ \ifcase\tabu@nested \thr@@ % outer goes into mode 3
+ \else\iftabu@measuring \tw@ % outer is in mode 4
+ \else \@ne % outer is in mode 3
+ \fi\fi
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+ \fi
+ \expandafter \tabu@bufferX \expandafter
+ \count@ \the\count@ \tabu@strategy
+}% \tabu@endtrial
+\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}}
+%% The algorithms: compute the widths / stop or go on ---------------
+\def\tabu@arithnegcoef {%
+ \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs
+}% \tabu@arithnegcoef
+\def\tabu@arith@negcoef #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition
+ \advance\@tempdima #2\tabucolX
+ \else
+ \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated
+ \advance\dimen@ -#2\p@
+ \advance\@tempdima -#2\tabucolX
+ \else
+ \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised
+ \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised
+ \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target)
+ \fi
+ \fi
+ \fi
+}% \tabu@arith@negcoef
+\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@
+ \ifdim \@tempdima=\z@
+ \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}%
+ \else
+ \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2}
+ *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}%
+ \fi
+}% \tabu@givespace
+\def\tabu@arith {\advance\tabu@cnt \@ne
+ \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi
+ \tabu@arithnegcoef
+ \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax %
+ \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax
+ \tabu@message{\tabu@message@arith}%
+ \ifdim \tabu@DELTA <\tabu@hfuzz
+ \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ?
+ \let\tabu@ \tabu@givespace \tabu@Xcoefs
+ \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message
+ \else % already converged: nothing to do but nearly impossible...
+ \fi
+ \tabucolX \maxdimen
+ \tabu@measuringfalse
+ \else % need for narrower X columns
+ \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax
+ \tabu@measuringtrue
+ \@whilesw \iftabu@measuring\fi {%
+ \advance\tabu@cnt \@ne
+ \tabu@arithnegcoef
+ \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here
+ \tabu@message{\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else
+ \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@
+ \fi}%
+ \ifdim -\tabu@DELTA<\tabu@hfuzz
+ \advance\@tempdima \@tempdimb % for message
+ \tabu@measuringfalse
+ \else
+ \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax
+ \fi
+ }%
+ \fi
+ \tabu@message{\tabu@message@reached}%
+ \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+}% \tabu@arith
+\def\tabu@spreadarith {%
+ \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs
+ \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}%
+ \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax
+ \iftabu@measuring
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}%
+ \else
+ \tabu@message{\tabu@message@spreadarith}%
+ \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target
+ \tabu@message{(tabu) spread
+ \ifdim \@tempdimc>\tabu@target useless here: default target used%
+ \else too large: reduced to fit default target\fi.}%
+ \else
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}%
+ \fi
+ \begingroup \let\tabu@wddef \@gobbletwo
+ \@tempdimb \@tempdima
+ \tabucolX@init
+ \tabu@arithnegcoef
+ \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax
+ \expandafter\endgroup \expandafter\tabucolX \the\tabucolX
+ \tabu@arith
+ \fi
+}% \tabu@spreadarith
+\def\tabu@spread@arith #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@
+ \else \advance\@tempdima \tabu@wd{#1}\relax
+ \fi
+}% \tabu@spread@arith
+%% Reporting in the .log file ---------------------------------------
+\def\tabu@message@defaulttarget{%
+ \ifnum\tabu@nested=\z@^^J(tabu) Default target:
+ \ifx\tabudefaulttarget\linewidth \string\linewidth
+ \ifdim \tabu@thetarget=\linewidth \else
+ -\the\dimexpr\linewidth-\tabu@thetarget\fi =
+ \else\ifx\tabudefaulttarget\linegoal\string\linegoal=
+ \fi\fi
+ \else (tabu) Default target (nested): \fi
+ \the\tabu@target \on@line
+ \ifnum\tabu@nested=\z@ , page \the\c@page\fi}
+\def\tabu@message@target {^^J(tabu) Target specified:
+ \the\tabu@target \on@line, page \the\c@page}
+\def\tabu@message@arith {\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else
+ \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@
+ \fi
+}% \tabu@message@arith
+\def\tabu@message@spreadarith {\tabu@spreadheader
+ \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@
+ \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@
+ \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@
+ \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target
+ \else \@tempdimc+\tabu@spreadtarget \fi
+ {}{}{}{}{}\@@}
+\def\tabu@message@negcoef #1#2{
+ \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]:
+ \space width = \tabu@wd {#1}
+ \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname
+ \ifdim -\tabu@pt#2\tabucolX<\tabu@target
+ < \number-\rem@pt#2 X
+ = \the\dimexpr -\tabu@pt#2\tabucolX \relax
+ \else
+ <= \the\tabu@target\space < \number-\rem@pt#2 X\fi}
+\def\tabu@message@reached{\tabu@header
+ ******* Reached Target:
+ hfuzz = \tabu@hfuzz\on@line\space *******}
+\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}%
+ \tabu@message{(tabu)\tabu@spaces Time elapsed during measure:
+ \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec
+ \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime)
+ -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax
+ *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space
+ cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}}
+\def\tabu@message@verticalsp {%
+ \ifdim \@tempdima>\tabu@ht
+ \ifdim \@tempdimb>\tabu@dp
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J%
+ \else
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J%
+ \fi
+ \else\ifdim \@tempdimb>\tabu@dp
+ \tabu@spaces\tabu@spaces\tabu@spaces
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi
+ \fi
+}% \tabu@message@verticalsp
+\edef\tabu@spaces{\@spaces}
+\def\tabu@strippt{\expandafter\tabu@pt\the}
+{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}}
+\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr}
+\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt}
+\def\do #1{%
+ \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{%
+ \ifnum##1<10 #1 #1\else
+ \ifnum##1<100 #1 \else
+ \ifnum##1<\@m #1\fi\fi\fi
+ ##1.##2##3##4##5##6##7##8#1}%
+ \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }%
+ \def\tabu@titles{\ifnum \tabu@nested=\z@
+ (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target
+ #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}%
+ \def\tabu@spreadheader{%
+ (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min.
+ #1 New Target^^J%
+ (tabu) sprd}
+ \def\tabu@message@save {\begingroup
+ \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@}
+ \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt
+ \dimexpr####1\p@{ }{ }}}%
+ \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}%
+ \let\CT@arc@ \relax \let\@preamble \@gobble
+ \let\tabu@savedpream \@firstofone
+ \let\tabu@savedparams \@firstofone
+ \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}%
+ \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}%
+ \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}%
+ \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}%
+ \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}%
+ \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}%
+ \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}%
+ \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}%
+ \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}%
+ \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}%
+ \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }%
+ \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}%
+ \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}%
+ \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}%
+ \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}%
+ \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}%
+ \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}%
+ \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}%
+ \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo
+ \tabu@message{%
+ (tabu) \string\savetabu{\tabu@temp}: \on@line^^J%
+ \tabu@usetabu \@nil^^J}%
+ \endgroup}
+}\do{ }
+%% Measuring the natural width (varwidth) - store the results -------
+\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop
+ \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}%
+ \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ?
+ \iftabu@spread \else % if spread -> measure
+ \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure
+ \let\@startpbox \tabu@startpboxORI % restore immediately (nesting)
+ \tabu@measuringtrue % for the quick option...
+ \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi
+ \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target
+ \tabu@target=\tabu@temp\tabucolX \fi\fi
+ \setbox\tabu@box \hbox \bgroup
+ \begin{varwidth}\tabu@target
+ \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width...
+ \narrowragged \arraybackslash \parfillskip \@flushglue
+ \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi
+ \bgroup \aftergroup\tabu@endpboxmeasure
+ \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi
+ \else \expandafter\@gobble
+ \tabu@startpboxquick{#1}% \@gobble \bgroup
+ \fi
+}% \tabu@startpboxmeasure
+\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty
+ \bgroup\color@begingroup}
+\def\tabu@endpboxmeasure {%
+ \@finalstrut \@arstrutbox
+ \end{varwidth}\egroup %
+ \ifdim \tabu@temp\p@ <\z@ % neg coef
+ \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box
+ \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}%
+ \tabu@debug{\tabu@message@endpboxmeasure}%
+ \fi
+ \else % spread coef>0
+ \global\advance \tabu@naturalX \wd\tabu@box
+ \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax
+ \ifdim \tabu@naturalXmax <\tabu@naturalX
+ \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi
+ \ifdim \tabu@naturalXmin <\@tempdima
+ \xdef\tabu@naturalXmin {\the\@tempdima}\fi
+ \fi
+ \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target
+}% \tabu@endpboxmeasure
+\def\tabu@wddef #1{\expandafter\xdef
+ \csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd
+ \the\tabu@Xcol. X[\tabu@temp]:
+ target = \the\tabucolX \space
+ \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol
+ =\tabu@wd\tabu@Xcol
+}% \tabu@message@endpboxmeasure
+\def\tabu@startpboxquick {\bgroup
+ \let\@startpbox \tabu@startpboxORI % restore immediately
+ \let\tabu \tabu@quick % \begin is expanded before...
+ \expandafter\@gobble \@startpbox % gobbles \bgroup
+}% \tabu@startpboxquick
+\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick
+}% \tabu@quick
+\def\tabu@endquick {%
+ \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else
+ \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax
+ \endgroup
+ \else \let\endtabu \relax
+ \tabu@end@envir
+ \fi
+}% \tabu@quick
+\def\tabu@endtabu {\end{tabu}}
+\def\tabu@endtabus {\end{tabu*}}
+%% Measuring the heights and depths - store the results -------------
+\def\tabu@verticalmeasure{\everypar{}%
+ \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group
+ \setbox\tabu@box =\hbox\bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@lcr
+ \d@llarbegin % after \hbox ...
+ \else
+ \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop
+ \else\ifnum\currentgrouptype=12\vcenter
+ \else\vbox\fi\fi}%
+ \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@pmb
+ \fi
+}% \tabu@verticalmeasure
+\def\tabu@verticalsp@lcr{%
+ \d@llarend \egroup %
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \noindent\vrule height\@tempdima depth\@tempdimb
+}% \tabu@verticalsp@lcr
+\def\tabu@verticalsp@pmb{% inserts struts as needed
+ \par \expandafter\egroup
+ \expandafter$\expandafter
+ \egroup \expandafter
+ \@tempdimc \the\prevdepth
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \let\@finalstrut \@gobble
+ \hrule height\@tempdima depth\@tempdimb width\hsize
+%% \box\tabu@box
+}% \tabu@verticalsp@pmb
+
+\def\tabu@verticalinit{%
+ \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset !
+ \advance\c@taburow \@ne
+ \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}%
+ \advance\c@taburow \m@ne
+}% \tabu@verticalinit
+\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@verticaldynamicadjustment {%
+ \advance\c@taburow \@ne
+ \extrarowheight \dimexpr\tabu@ht - \ht\strutbox
+ \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox
+ \let\arraystretch \@empty
+ \advance\c@taburow \m@ne
+}% \tabu@verticaldynamicadjustment
+\def\tabuphantomline{\crcr \noalign{%
+ {\globaldefs \@ne
+ \setbox\@arstrutbox \box\voidb@x
+ \let\tabu@@celllalign \tabu@celllalign
+ \let\tabu@@cellralign \tabu@cellralign
+ \let\tabu@@cellleft \tabu@cellleft
+ \let\tabu@@cellright \tabu@cellright
+ \let\tabu@@thevline \tabu@thevline
+ \let\tabu@celllalign \@empty
+ \let\tabu@cellralign \@empty
+ \let\tabu@cellright \@empty
+ \let\tabu@cellleft \@empty
+ \let\tabu@thevline \relax}%
+ \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}%
+ \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr
+ \noalign{\tabu@rearstrut
+ {\globaldefs\@ne
+ \let\tabu@celllalign \tabu@@celllalign
+ \let\tabu@cellralign \tabu@@cellralign
+ \let\tabu@cellleft \tabu@@cellleft
+ \let\tabu@cellright \tabu@@cellright
+ \let\tabu@thevline \tabu@@thevline}}}%
+ \expandafter}\the\toks@
+}% \tabuphantomline
+%% \firsthline and \lasthline corrections ---------------------------
+\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}}
+\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline}
+\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}}
+\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline}
+\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument)
+ \noalign{\ifnum0=`}\fi
+ {\CT@arc@\hrule height\arrayrulewidth}%
+ \futurelet \tabu@temp \tabu@xhline
+}% \tabu@hline
+\def\tabu@xhline{%
+ \ifx \tabu@temp \hline
+ {\ifx \CT@drsc@\relax \vskip
+ \else\ifx \CT@drsc@\@empty \vskip
+ \else \CT@drsc@\hrule height
+ \fi\fi
+ \doublerulesep}%
+ \fi
+ \ifnum0=`{\fi}%
+}% \tabu@xhline
+\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@
+ \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}%
+ \tabu@hlineAZsurround
+}% \tabu@hlineAZ
+\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{%
+ \extratabsurround #1\let\tabucline \tabucline@scan
+ \let\hline \tabu@hlinescan \let\firsthline \hline
+ \let\cline \tabu@clinescan \let\lasthline \hline
+ \expandafter \futurelet \expandafter \tabu@temp
+ \expandafter \tabu@nexthlineAZ \tabu@temp
+}% \tabu@hlineAZsurround
+\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline}
+\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}}
+\def\tabucline@scan{\@testopt \tabucline@sc@n {}}
+\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}}
+\def\tabu@nexthlineAZ{%
+ \ifx \tabu@temp\hline \else
+ \ifx \tabu@temp\cline \else
+ \ifx \tabu@temp\tabucline \else
+ \tabu@hlinecorrection
+ \fi\fi\fi
+}% \tabu@nexthlineAZ
+\def\tabu@xhlineAZ #1{%
+ \toks@\expandafter{\the\toks@ #1}%
+ \@tempdimc \tabu@thick % The last line width
+ \ifcase\count@ \@tempdimb \tabu@thick % The first line width
+ \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax
+ \fi
+ \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ
+}% \tabu@xhlineAZ
+\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1
+ \@tempdima \dimexpr \ht\@arstrutbox+\dimen@
+ \edef\firsthline{%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ height \the\dimexpr\@tempdima+\extratabsurround
+ depth \dp\@arstrutbox
+ width \tabustrutrule}\hss}\cr
+ \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb
+ +\dp\@arstrutbox \relax}%
+ \the\toks@
+ }\ifnum0=`{\fi
+ \expandafter}\firsthline % we are then !
+}% \tabu@firsthlinecorrection
+\def\tabu@lasthlinecorrection{%
+ \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc
+ \edef\lasthline{%
+ \the\toks@
+ \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@
+ +\extratabsurround-\@tempdimc
+ height \z@
+ width \tabustrutrule}\hss}\cr
+ }\ifnum0=`{\fi
+ \expandafter}\lasthline % we are then !
+}% \tabu@lasthlinecorrection
+\def\tabu@LT@@hline{%
+ \ifx\LT@next\hline
+ \global\let\LT@next \@gobble
+ \ifx \CT@drsc@\relax
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}%
+ \else
+ \gdef\CT@LT@sep{%
+ \multispan\LT@cols{%
+ \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
+ \fi
+ \else
+ \global\let\LT@next\empty
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \CT@LT@sep
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \noalign{\penalty\@M}%
+ \LT@next
+}% \tabu@LT@@hline
+%% Horizontal lines : \tabucline ------------------------------------
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline}
+\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}%
+ \ifnum \tabu@stop<\z@ \toks@{}%
+ \else \tabu@clinearg{#1}\tabu@thestyle
+ \edef\tabucline{\toks@{%
+ \ifnum \tabu@start>\z@ \omit
+ \tabu@multispan\tabu@start {\span\omit}&\fi
+ \omit \tabu@multispan\tabu@stop {\span\omit}%
+ \tabu@thehline\cr
+ }}\tabucline
+ \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}%
+ \fi
+ \futurelet \tabu@temp \tabu@xcline
+}% \tabu@cline
+\def\tabu@clinearg #1{%
+ \ifx\\#1\\\let\tabu@thestyle \tabu@ls@
+ \else \@defaultunits \expandafter\let\expandafter\@tempa
+ \romannumeral-`\0#1\relax \@nnil
+ \ifx \hbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \box\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vtop\@tempa \tabu@clinebox{#1}%
+ \else\ifx \copy\@tempa \tabu@clinebox{#1}%
+ \else\ifx \leaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \cleaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \xleaders\@tempa \tabu@clineleads{#1}%
+ \else\tabu@getline {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+}% \tabu@clinearg
+\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}}
+\def\tabu@clineleads #1{%
+ \let\tabu@thestyle \relax \let\tabu@leaders \@undefined
+ \gdef\tabu@thehrule{#1}}
+\def\tabu@thehline{\begingroup
+ \ifdefined\tabu@leaders
+ \noexpand\tabu@thehleaders
+ \else \noexpand\tabu@thehrule
+ \fi \endgroup
+}% \tabu@thehline
+\def\tabu@xcline{%
+ \ifx \tabu@temp\tabucline
+ \toks@\expandafter{\the\toks@ \noalign
+ {\ifx\CT@drsc@\relax \vskip
+ \else \CT@drsc@\hrule height
+ \fi
+ \doublerulesep}}%
+ \fi
+ \tabu@docline
+}% \tabu@xcline
+\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@}
+\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}%
+ \ifnum0=`{\fi}\aftergroup\tabu@doclineafter}
+\def\tabu@multispan #1#2{%
+ \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan
+ \else \expandafter\@gobbletwo
+ \fi {#1-1}{#2}%
+}% \tabu@multispan
+\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil}
+\def\tabu@start@stop #1-#2\@nnil{%
+ \@defaultunits \tabu@start\number 0#1\relax \@nnil
+ \@defaultunits \tabu@stop \number 0#2\relax \@nnil
+ \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne
+ \else\ifnum \tabu@stop=\z@ \tabu@nbcols
+ \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols
+ \else \tabu@stop
+ \fi\fi\fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi
+}% \tabu@start@stop
+%% Numbers: siunitx S columns (and \tabudecimal) -------------------
+\def\tabu@tabudecimal #1{%
+ \def\tabu@decimal{#1}\@temptokena{}%
+ \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces
+ \tabu@scandecimal
+}% \tabu@tabudecimal
+\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@}
+\def\tabu@skipdecimal#1{#1\tabu@scandecimal}
+\def\tabu@getdecimal@ignorespaces{%
+ \ifcase 0\ifx\tabu@temp\ignorespaces\else
+ \ifx\tabu@temp\@sptoken1\else
+ 2\fi\fi\relax
+ \let\tabu@getdecimal@ \tabu@getdecimal
+ \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal
+ \else \expandafter\tabu@skipdecimal
+ \fi
+}% \tabu@getdecimal@ignorespaces
+\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}%
+ \tabu@scandecimal}
+\def\do#1{%
+ \def\tabu@get@decimalspace#1{%
+ \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}%
+}\do{ }
+\let\tabu@@tabudecimal \tabu@tabudecimal
+\def\tabu@getdecimal{%
+ \ifcase 0\ifx 0\tabu@temp\else
+ \ifx 1\tabu@temp\else
+ \ifx 2\tabu@temp\else
+ \ifx 3\tabu@temp\else
+ \ifx 4\tabu@temp\else
+ \ifx 5\tabu@temp\else
+ \ifx 6\tabu@temp\else
+ \ifx 7\tabu@temp\else
+ \ifx 8\tabu@temp\else
+ \ifx 9\tabu@temp\else
+ \ifx .\tabu@temp\else
+ \ifx ,\tabu@temp\else
+ \ifx -\tabu@temp\else
+ \ifx +\tabu@temp\else
+ \ifx e\tabu@temp\else
+ \ifx E\tabu@temp\else
+ \ifx\tabu@cellleft\tabu@temp1\else
+ \ifx\ignorespaces\tabu@temp1\else
+ \ifx\@sptoken\tabu@temp2\else
+ 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \expandafter\tabu@get@decimal
+ \or \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@get@decimalspace
+ \else\expandafter\tabu@printdecimal
+ \fi
+}% \tabu@getdecimal
+\def\tabu@printdecimal{%
+ \edef\tabu@temp{\the\@temptokena}%
+ \ifx\tabu@temp\@empty\else
+ \ifx\tabu@temp\space\else
+ \expandafter\tabu@decimal\expandafter{\the\@temptokena}%
+ \fi\fi
+}% \tabu@printdecimal
+%% Verbatim inside X columns ----------------------------------------
+\def\tabu@verbatim{%
+ \let\verb \tabu@verb
+ \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd
+}% \tabu@verbatim
+\let\tabu@ltx@verb \verb
+\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb}
+\def\tabu@fancyvrb {%
+ \def\tabu@FV@DefineCheckEnd ##1{%
+ \def\tabu@FV@DefineCheckEnd{%
+ ##1%
+ \let\FV@CheckEnd \tabu@FV@CheckEnd
+ \let\FV@@CheckEnd \tabu@FV@@CheckEnd
+ \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd
+ \edef\FV@EndScanning{%
+ \def\noexpand\next{\noexpand\end{\FV@EnvironName}}%
+ \global\let\noexpand\FV@EnvironName\relax
+ \noexpand\next}%
+ \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}%
+ }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd}
+}% \tabu@fancyvrb
+\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil}
+\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}}
+\begingroup
+\catcode`\[1 \catcode`\]2
+\@makeother\{ \@makeother\}
+ \edef\x[\endgroup
+ \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3%
+ ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}}
+\def\tabu@FV@ListProcessLine #1{%
+ \hbox {%to \hsize{%
+ \kern\leftmargin
+ \hbox {%to \linewidth{%
+ \FV@LeftListNumber
+ \FV@LeftListFrame
+ \FancyVerbFormatLine{#1}\hss
+%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on)
+%% \FV@RightListFrame}%
+ \FV@RightListFrame
+ \FV@RightListNumber}%
+%% DG/SR modification end
+ \hss}}
+%% \savetabu --------------------------------------------------------
+\newcommand*\savetabu[1]{\noalign{%
+ \tabu@sanitizearg{#1}\tabu@temp
+ \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else
+ \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}%
+ \ifdefined\tabu@restored \expandafter\let
+ \csname tabu@saved@\tabu@temp \endcsname \tabu@restored
+ \else {\tabu@save}%
+ \fi
+ \fi}%
+}% \savetabu
+\def\tabu@save {%
+ \toks0\expandafter{\tabu@saved@}%
+ \iftabu@negcoef
+ \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}%
+ \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi
+ \toks1\expandafter{\tabu@savedpream}%
+ \toks2\expandafter{\tabu@savedpreamble}%
+ \let\@preamble \relax
+ \let\tabu@savedpream \relax \let\tabu@savedparams \relax
+ \edef\tabu@preamble{%
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \edef\tabu@usetabu{%
+ \def\@preamble {\noexpand\the\toks2}%
+ \tabu@target \the\tabu@target \relax
+ \tabucolX \the\tabucolX \relax
+ \tabu@nbcols \the\tabu@nbcols \relax
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \let\tabu@aligndefault \relax \let\@sharp \relax
+ \edef\@tempa{\noexpand\tabu@s@ved
+ {\tabu@usetabu}
+ {\tabu@preamble}
+ {\the\toks1}}\@tempa
+ \tabu@message@save
+}% \tabu@save
+\long\def\tabu@s@ved #1#2#3{%
+ \def\tabu@usetabu{#1}%
+ \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{%
+ \ifodd ##1% \usetabu
+ \tabu@measuringfalse \tabu@spreadfalse % Just in case...
+ \gdef\tabu@usetabu {%
+ \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi
+ \global\let\tabu@usetabu \@undefined
+ \def\@halignto {to\tabu@target}%
+ #1%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \else % \preamble
+ \gdef\tabu@preamble {%
+ \global\let\tabu@preamble \@undefined
+ #2%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \fi
+ #3}%
+}% \tabu@s@ved
+\def\tabu@aligndefault@text {\tabu@aligndefault}%
+\def\tabu@warn@usetabu {\PackageWarning{tabu}
+ {Specifying a target with \string\usetabu\space is useless
+ \MessageBreak The target cannot be changed!}}
+\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi}
+\def\tabu@savewarn#1#2{\PackageInfo{tabu}
+ {User-name `#1' already used for \string\savetabu
+ \MessageBreak #2}}%
+\def\tabu@saveerr#1{\PackageError{tabu}
+ {User-name `#1' is unknown for \string\usetabu
+ \MessageBreak I cannot restore an unknown preamble!}\@ehd}
+%% \rowfont ---------------------------------------------------------
+\newskip \tabu@cellskip
+\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi
+ {\ifnum0=`}\fi \tabu@row@font}
+\newcommand*\tabu@row@font[2][]{%
+ \ifnum7=\currentgrouptype
+ \global\let\tabu@@cellleft \tabu@cellleft
+ \global\let\tabu@@cellright \tabu@cellright
+ \global\let\tabu@@celllalign \tabu@celllalign
+ \global\let\tabu@@cellralign \tabu@cellralign
+ \global\let\tabu@@rowfontreset\tabu@rowfontreset
+ \fi
+ \global\let\tabu@rowfontreset \tabu@rowfont@reset
+ \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}%
+ \ifcsname tabu@cell@#1\endcsname % row alignment
+ \csname tabu@cell@#1\endcsname \fi
+ \ifnum0=`{\fi}% end of group / noalign group
+}% \rowfont
+\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}%
+\def\tabu@rowfont@reset{%
+ \global\let\tabu@rowfontreset \tabu@@rowfontreset
+ \global\let\tabu@cellleft \tabu@@cellleft
+ \global\let\tabu@cellright \tabu@@cellright
+ \global\let\tabu@cellfont \@empty
+ \global\let\tabu@celllalign \tabu@@celllalign
+ \global\let\tabu@cellralign \tabu@@cellralign
+}% \tabu@@rowfontreset
+\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl
+%% \tabu@prepnext@tok -----------------------------------------------
+\newif \iftabu@cellright
+\def\tabu@prepnext@tok{%
+ \ifnum \count@<\z@ %
+ \@tempcnta \@M %
+ \tabu@nbcols\z@
+ \let\tabu@fornoopORI \@fornoop
+ \tabu@cellrightfalse
+ \else
+ \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left
+ \advance \tabu@nbcols \@ne
+ \iftabu@cellright % before-previous token is right and is finished
+ \tabu@cellrightfalse %
+ \tabu@righttok
+ \fi
+ \tabu@lefttok
+ \or % (case 1) previous token is right
+ \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop
+ \else % special column: do not change the token
+ \iftabu@cellright % before-previous token is right
+ \tabu@cellrightfalse
+ \tabu@righttok
+ \fi
+ \fi % \ifcase
+ \fi
+ \tabu@prepnext@tokORI
+}% \tabu@prepnext@tok
+\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@}
+\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{%
+ \ifx \in@#2\else
+ \let\@fornoop \tabu@fornoopORI
+ \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}%
+ \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}%
+ \expandafter\prepnext@tok
+ \fi
+}% \tabu@lastnoop
+\def\tabu@righttok{%
+ \advance \count@ \m@ne
+ \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}%
+ \advance \count@ \@ne
+}% \tabu@righttok
+\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign
+ \the\toks\count@ \tabu@cellleft}% after because of $
+}% \tabu@lefttok
+%% Neutralisation of glues ------------------------------------------
+\let\tabu@cellleft \@empty
+\let\tabu@cellright \@empty
+\tabu@celllalign@def{\tabu@cellleft}%
+\let\tabu@cellralign \@empty
+\def\tabu@cell@align #1#2#3{%
+ \let\tabu@maybesiunitx \toks@ \tabu@celllalign
+ \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}%
+ \toks@\expandafter{\tabu@cellralign #2}%
+ \xdef\tabu@cellralign{\the\toks@}%
+ \toks@\expandafter{\tabu@cellleft #3}%
+ \xdef\tabu@cellleft{\the\toks@}%
+}% \tabu@cell@align
+\def\tabu@cell@l{% force alignment to left
+ \tabu@cell@align
+ {\tabu@removehfil \raggedright \tabu@cellleft}% left
+ {\tabu@flush1\tabu@ignorehfil}% right
+ \raggedright
+}% \tabu@cell@l
+\def\tabu@cell@c{% force alignment to center
+ \tabu@cell@align
+ {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \centering
+}% \tabu@cell@c
+\def\tabu@cell@r{% force alignment to right
+ \tabu@cell@align
+ {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft}
+ \tabu@ignorehfil
+ \raggedleft
+}% \tabu@cell@r
+\def\tabu@cell@j{% force justification (for p, m, b columns)
+ \tabu@cell@align
+ {\tabu@justify\tabu@cellleft}
+ {}
+ \tabu@justify
+}% \tabu@cell@j
+\def\tabu@justify{%
+ \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip
+ \parfillskip\@flushglue
+}% \tabu@justify
+%% ragged2e settings
+\def\tabu@cell@L{% force alignment to left (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedRight \tabu@cellleft}
+ {\tabu@flush 1\tabu@ignorehfil}
+ \RaggedRight
+}% \tabu@cell@L
+\def\tabu@cell@C{% force alignment to center (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \Centering
+}% \tabu@cell@C
+\def\tabu@cell@R{% force alignment to right (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft}
+ \tabu@ignorehfil
+ \RaggedLeft
+}% \tabu@cell@R
+\def\tabu@cell@J{% force justification (ragged2e)
+ \tabu@cell@align
+ {\justifying \tabu@cellleft}
+ {}
+ \justifying
+}% \tabu@cell@J
+\def\tabu@flush#1{%
+ \iftabu@colortbl % colortbl uses \hfill rather than \hfil
+ \hskip \ifnum13<\currentgrouptype \stretch{#1}%
+ \else \ifdim#1pt<\p@ \tabu@cellskip
+ \else \stretch{#1}
+ \fi\fi \relax
+ \else % array.sty
+ \ifnum 13<\currentgrouptype
+ \hfil \hskip1sp \relax \fi
+ \fi
+}% \tabu@flush
+\let\tabu@hfil \hfil
+\let\tabu@hfill \hfill
+\let\tabu@hskip \hskip
+\def\tabu@removehfil{%
+ \iftabu@colortbl
+ \unkern \tabu@cellskip =\lastskip
+ \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip
+ \else \tabu@cellskip \z@skip
+ \fi
+ \else
+ \ifdim\lastskip=1sp\unskip\fi
+ \ifnum\gluestretchorder\lastskip =\@ne
+ \hfilneg % \hfilneg for array.sty but not for colortbl...
+ \fi
+ \fi
+}% \tabu@removehfil
+\def\tabu@ignorehfil{\aftergroup \tabu@nohfil}
+\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil
+ \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group
+}% \tabu@nohfil
+\def\tabu@colortblalignments {% if colortbl
+ \def\tabu@nohfil{%
+ \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group
+ \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff...
+ \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local
+}% \tabu@colortblalignments
+%% Taking care of footnotes and hyperfootnotes ----------------------
+\long\def\tabu@footnotetext #1{%
+ \edef\@tempa{\the\tabu@footnotes
+ \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}%
+ \global\tabu@footnotes\expandafter{\@tempa {#1}}}%
+\long\def\tabu@xfootnotetext [#1]#2{%
+ \global\tabu@footnotes\expandafter{\the\tabu@footnotes
+ \footnotetext [{#1}]{#2}}}
+\let\tabu@xfootnote \@xfootnote
+\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }}
+\long\def\tabu@Hy@xfootnote [#1]{%
+ \begingroup
+ \value\@mpfn #1\relax
+ \protected@xdef \@thefnmark {\thempfn}%
+ \endgroup
+ \@footnotemark \tabu@Hy@ftntxt {#1}%
+}% \tabu@Hy@xfootnote
+\long\def\tabu@Hy@ftntxt #1#2{%
+ \edef\@tempa{%
+ \the\tabu@footnotes
+ \begingroup
+ \value\@mpfn #1\relax
+ \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}%
+ \expandafter \noexpand \expandafter
+ \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}%
+ }%
+ \global\tabu@footnotes\expandafter{\@tempa {#2}%
+ \endgroup}%
+}% \tabu@Hy@ftntxt
+\long\def\tabu@Hy@footnotetext #1#2{%
+ \H@@footnotetext{%
+ \ifHy@nesting
+ \hyper@@anchor {#1}{#2}%
+ \else
+ \Hy@raisedlink{%
+ \hyper@@anchor {#1}{\relax}%
+ }%
+ \def\@currentHref {#1}%
+ \let\@currentlabelname \@empty
+ #2%
+ \fi
+ }%
+}% \tabu@Hy@footnotetext
+%% No need for \arraybackslash ! ------------------------------------
+\def\tabu@latextwoe {%
+\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@centering \centering \arraybackslash
+\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash
+\tabu@temp \tabu@raggedright \raggedright \arraybackslash
+}% \tabu@latextwoe
+\def\tabu@raggedtwoe {%
+\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@Centering \Centering \arraybackslash
+\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash
+\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash
+\tabu@temp \tabu@justifying \justifying \arraybackslash
+}% \tabu@raggedtwoe
+\def\tabu@normalcrbackslash{\let\\\@normalcr}
+\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{%
+ \expandafter\tabu@normalcrbackslash \@trivlist}}
+%% Utilities: \fbox \fcolorbox and \tabudecimal -------------------
+\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox}
+\def\tabu@beginfbox {\bgroup \kern\fboxsep
+ \bgroup\aftergroup\tabu@endfbox}
+\def\tabu@endfbox {\kern\fboxsep\egroup\egroup
+ \@frameb@x\relax}
+\def\tabu@color@b@x #1#2{\leavevmode \bgroup
+ \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}%
+ \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox
+}% \tabu@color@b@x
+\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup
+ \aftergroup\tabu@endcolor@b@x \set@color}
+\def\tabu@endcolor@b@x {\kern\fboxsep \egroup
+ \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@
+ \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@
+ \tabu@docolor@b@x \egroup
+}% \tabu@endcolor@b@x
+%% Corrections (arydshln, delarray, colortbl) -----------------------
+\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray
+ \iftabu@colortbl
+ \ifdefined\adl@array %
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup %
+ \@arrayright %
+ \gdef\@preamble{}}%
+ \else %
+ \def\tabu@endarray{%
+ \crcr \egroup \egroup %
+ \@arrayright %
+ \gdef\@preamble{}\CT@end}%
+ \fi
+ \else
+ \ifdefined\adl@array %
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \egroup %
+ \@arrayright %
+ \gdef\@preamble{}}%
+ \else %
+ \PackageWarning{tabu}
+ {\string\@arrayright\space is missing from the
+ \MessageBreak definition of \string\endarray.
+ \MessageBreak Compatibility with delarray.sty is broken.}%
+ \fi\fi
+}% \tabu@fix@arrayright
+\def\tabu@adl@xarraydashrule #1#2#3{%
+ \ifnum\@lastchclass=\adl@class@start\else
+ \ifnum\@lastchclass=\@ne\else
+ \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1)
+ \adl@leftrulefalse \fi\fi % must be treated the same
+ \fi
+ \ifadl@zwvrule\else \ifadl@inactive\else
+ \@addtopreamble{\vrule\@width\arrayrulewidth
+ \@height\z@ \@depth\z@}\fi \fi
+ \ifadl@leftrule
+ \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#1}#3}%
+ \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#2}#3}
+ \fi
+}% \tabu@adl@xarraydashrule
+\def\tabu@adl@act@endpbox {%
+ \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox
+ \egroup \egroup
+ \adl@colhtdp \box\adl@box \hfil
+}% \tabu@adl@act@endpbox
+\def\tabu@adl@fix {%
+ \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln
+ \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln
+ \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln
+ \let\@preamerror \@preamerr % arydshln
+}% \tabu@adl@fix
+%% Correction for longtable' \@startbox definition ------------------
+%% => \everypar is ``missing'' : TeX should be in vertical mode
+\def\tabu@LT@startpbox #1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+}% \tabu@LT@startpbox
+%% \tracingtabu and the package options ------------------
+\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}}
+\DeclareOption{linegoal}{%
+ \AtEndOfPackage{%
+ \RequirePackage{linegoal}[2010/12/07]%
+ \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX
+}}
+\DeclareOption{scantokens}{\tabuscantokenstrue}
+\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}}
+\def\tracingtabu {\begingroup\@ifnextchar=%
+ {\afterassignment\tabu@tracing\count@}
+ {\afterassignment\tabu@tracing\count@1\relax}}
+\def\tabu@tracing{\expandafter\endgroup
+ \expandafter\tabu@tr@cing \the\count@ \relax
+}% \tabu@tracing
+\def\tabu@tr@cing #1\relax {%
+ \ifnum#1>\thr@@ \let\tabu@tracinglines\message
+ \else \let\tabu@tracinglines\@gobble
+ \fi
+ \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG
+ \def\tabu@mkarstrut {\tabu@DBG@arstrut}%
+ \tabustrutrule 1.5\p@
+ \else \let\tabu@DBG \@gobble
+ \def\tabu@mkarstrut {\tabu@arstrut}%
+ \tabustrutrule \z@
+ \fi
+ \ifnum#1>\@ne \let\tabu@debug \message
+ \else \let\tabu@debug \@gobble
+ \fi
+ \ifnum#1>\z@
+ \let\tabu@message \message
+ \let\tabu@tracing@save \tabu@message@save
+ \let\tabu@starttimer \tabu@pdftimer
+ \else
+ \let\tabu@message \@gobble
+ \let\tabu@tracing@save \@gobble
+ \let\tabu@starttimer \relax
+ \fi
+}% \tabu@tr@cing
+%% Setup \AtBeginDocument
+\AtBeginDocument{\tabu@AtBeginDocument}
+\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined
+ \ifdefined\arrayrulecolor \tabu@colortbltrue %
+ \tabu@colortblalignments % different glues are used
+ \else \tabu@colortblfalse \fi
+ \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi
+ \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi
+ \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@
+ \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname %
+ \expandafter\ifx
+ \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax
+ \tabu@siunitxtrue
+ \else \let\tabu@maybesiunitx \@firstofone %
+ \let\tabu@siunitx \tabu@nosiunitx
+ \tabu@siunitxfalse
+ \fi
+ \ifdefined\adl@array %
+ \else \let\tabu@adl@fix \relax
+ \let\tabu@adl@endtrial \@empty \fi
+ \ifdefined\longtable %
+ \else \let\longtabu \tabu@nolongtabu \fi
+ \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi
+ \csname\ifcsname ifHy@hyperfootnotes\endcsname %
+ ifHy@hyperfootnotes\else iffalse\fi\endcsname
+ \let\tabu@footnotetext \tabu@Hy@ftntext
+ \let\tabu@xfootnote \tabu@Hy@xfootnote \fi
+ \ifdefined\FV@DefineCheckEnd%
+ \tabu@fancyvrb \fi
+ \ifdefined\color %
+ \let\tabu@color \color
+ \def\tabu@leavevmodecolor ##1{%
+ \def\tabu@leavevmodecolor {\leavevmode ##1}%
+ }\expandafter\tabu@leavevmodecolor\expandafter{\color}%
+ \else
+ \let\tabu@color \tabu@nocolor
+ \let\tabu@leavevmodecolor \@firstofone \fi
+ \tabu@latextwoe
+ \ifdefined\@raggedtwoe@everyselectfont %
+ \tabu@raggedtwoe
+ \else
+ \let\tabu@cell@L \tabu@cell@l
+ \let\tabu@cell@R \tabu@cell@r
+ \let\tabu@cell@C \tabu@cell@c
+ \let\tabu@cell@J \tabu@cell@j \fi
+ \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}%
+ \ifin@ \let\tabu@endarray \endarray
+ \else \tabu@fix@arrayright \fi%
+ \everyrow{}%
+}% \tabu@AtBeginDocument
+\def\tabu@warn@cellspace{%
+ \PackageWarning{tabu}{%
+ Package cellspace has some limitations
+ \MessageBreak And redefines some macros of array.sty.
+ \MessageBreak Please use \string\tabulinesep\space to control
+ \MessageBreak vertical spacing of lines inside tabu environment}%
+}% \tabu@warn@cellspace
+%% tabu Package initialisation
+\tabuscantokensfalse
+\let\tabu@arc@G \relax
+\let\tabu@drsc@G \relax
+\let\tabu@evr@G \@empty
+\let\tabu@rc@G \@empty
+\def\tabu@ls@G {\tabu@linestyle@}%
+\let\tabu@@rowfontreset \@empty %
+\let\tabu@@celllalign \@empty
+\let\tabu@@cellralign \@empty
+\let\tabu@@cellleft \@empty
+\let\tabu@@cellright \@empty
+\def\tabu@naturalXmin {\z@}
+\def\tabu@naturalXmax {\z@}
+\let\tabu@rowfontreset \@empty
+\def\tabulineon {4pt}\let\tabulineoff \tabulineon
+\tabu@everyrowtrue
+\ifdefined\pdfelapsedtime %
+ \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}%
+\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax
+\fi
+\tracingtabu=\z@
+\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@
+\tabulinestyle{}
+\taburowcolors{}
+\let\tabudefaulttarget \linewidth
+\ProcessOptions* % \ProcessOptions* is quicker !
+\endinput
+%%
+%% End of file `tabu.sty'.
diff --git a/docs/latex/tree__node_8cpp.tex b/docs/latex/tree__node_8cpp.tex
new file mode 100644
index 0000000..eb258fd
--- /dev/null
+++ b/docs/latex/tree__node_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{tree__node_8cpp}{}\doxysection{tree\+\_\+node.\+cpp File Reference}
+\label{tree__node_8cpp}\index{tree\_node.cpp@{tree\_node.cpp}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include \char`\"{}tree\+\_\+node.\+h\char`\"{}}\newline
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{tree__node_8cpp_source}{tree\+\_\+node.\+cpp}}.
+
diff --git a/docs/latex/tree__node_8cpp_source.tex b/docs/latex/tree__node_8cpp_source.tex
new file mode 100644
index 0000000..64c5d3a
--- /dev/null
+++ b/docs/latex/tree__node_8cpp_source.tex
@@ -0,0 +1,80 @@
+\hypertarget{tree__node_8cpp_source}{}\doxysection{tree\+\_\+node.\+cpp}
+\mbox{\hyperlink{tree__node_8cpp}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00002}00002 \textcolor{comment}{ * @file tree\_node.cpp}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00012}00012 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{tree__node_8h}{tree\_node.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00013}00013 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00014}\mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{00014}} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode::TreeNode}}()}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00015}00015 : m\_type (\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}}::\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}})}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00016}00016 , m\_name (\textcolor{stringliteral}{"{}dbc"{}})}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00017}00017 , m\_children()}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00018}00018 , m\_frame()}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00019}00019 , m\_signal() \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00020}00020 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00021}00021 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00022}\mbox{\hyperlink{classTreeNode_a8e38dd591d8801d7ee3a7dbad90c67fc}{00022}} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode::TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame)}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00023}00023 : m\_type (\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}}::\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}})}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00024}00024 , m\_name (frame.name)}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00025}00025 , m\_children()}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00026}00026 , m\_frame (new \mbox{\hyperlink{structFrameInfo}{FrameInfo}} (frame))}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00027}00027 , m\_signal() \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00028}00028 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00029}00029 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00030}\mbox{\hyperlink{classTreeNode_ab9f00f5253d56461bb2d420fd639c5ae}{00030}} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode::TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&signal)}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00031}00031 : m\_type (\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}}::\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}})}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00032}00032 , m\_name (signal.name)}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00033}00033 , m\_children()}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00034}00034 , m\_frame()}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00035}00035 , m\_signal (new \mbox{\hyperlink{structSignalInfo}{SignalInfo}} (signal)) \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00036}00036 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00037}00037 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00038}\mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{00038}} \textcolor{keywordtype}{void} \mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{TreeNode::AddChild}} (std::unique\_ptr child) \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00039}00039 \textcolor{keywordflow}{if} (child)}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00040}00040 \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.push\_back (std::move (child));}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00041}00041 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00042}00042 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00043}\mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{00043}} std::size\_t \mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{TreeNode::GetChildCount}}()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00044}00044 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.size();}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00045}00045 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00046}00046 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00047}\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{00047}} \textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{TreeNode::GetChild}} (std::size\_t index)\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00048}00048 \textcolor{keywordflow}{if} (index >= \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.size())}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00049}00049 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00050}00050 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00051}00051 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}[index].get();}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00052}00052 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00053}00053 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00054}\mbox{\hyperlink{classTreeNode_a81047bd7d2a4cc96b9ef5e20d0d63b5f}{00054}} \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{TreeNode::GetChild}} (std::size\_t index) \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00055}00055 \textcolor{keywordflow}{if} (index >= \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}.size())}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00056}00056 \textcolor{keywordflow}{return} \textcolor{keyword}{nullptr};}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00057}00057 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00058}00058 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}}[index].get();}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00059}00059 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00060}00060 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00061}\mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{00061}} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{TreeNode::GetType}}()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00062}00062 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{m\_type}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00063}00063 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00064}00064 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00065}\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{00065}} \textcolor{keyword}{const} std::string \&\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{TreeNode::GetName}}()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00066}00066 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{m\_name}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00067}00067 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00068}00068 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00069}\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{00069}} \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{TreeNode::GetFrame}}()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00070}00070 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{m\_frame}}.get();}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00071}00071 \}}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00072}00072 }
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00073}\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{00073}} \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{TreeNode::GetSignal}}()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00074}00074 \textcolor{keywordflow}{return} \mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{m\_signal}}.get();}
+\DoxyCodeLine{\Hypertarget{tree__node_8cpp_source_l00075}00075 \}}
+
+\end{DoxyCode}
diff --git a/docs/latex/tree__node_8h.tex b/docs/latex/tree__node_8h.tex
new file mode 100644
index 0000000..30d9a85
--- /dev/null
+++ b/docs/latex/tree__node_8h.tex
@@ -0,0 +1,66 @@
+\hypertarget{tree__node_8h}{}\doxysection{tree\+\_\+node.\+h File Reference}
+\label{tree__node_8h}\index{tree\_node.h@{tree\_node.h}}
+
+
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+
+{\ttfamily \#include $<$string$>$}\newline
+{\ttfamily \#include $<$vector$>$}\newline
+{\ttfamily \#include $<$memory$>$}\newline
+{\ttfamily \#include $<$cstddef$>$}\newline
+{\ttfamily \#include \char`\"{}frame\+\_\+info.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}signal\+\_\+info.\+h\char`\"{}}\newline
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classTreeNode}{Tree\+Node}}
+\begin{DoxyCompactList}\small\item\em Tree node for later use in model/view or other hierarchy consumers. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum class \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}} \{ \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}}
+, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}}
+, \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}
+ \}
+\begin{DoxyCompactList}\small\item\em Type of a tree node. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Created\+: 2026-\/03-\/13 Author\+: Deeaitch (Dim. Himro)
+
+Licensed under the MIT License. See LICENSE file in the project root for full license text.
+
+Definition in file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
+
+
+\doxysubsection{Enumeration Type Documentation}
+\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}}
+\index{tree\_node.h@{tree\_node.h}!NodeType@{NodeType}}
+\index{NodeType@{NodeType}!tree\_node.h@{tree\_node.h}}
+\doxysubsubsection{\texorpdfstring{NodeType}{NodeType}}
+{\footnotesize\ttfamily enum class \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{Node\+Type}}\hspace{0.3cm}{\ttfamily [strong]}}
+
+
+
+Type of a tree node.
+
+\begin{DoxyEnumFields}{Enumerator}
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Root@{Root}!tree\_node.h@{tree\_node.h}}\index{tree\_node.h@{tree\_node.h}!Root@{Root}}}\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}}
+Root&\\
+\hline
+
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Frame@{Frame}!tree\_node.h@{tree\_node.h}}\index{tree\_node.h@{tree\_node.h}!Frame@{Frame}}}\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}}
+Frame&\\
+\hline
+
+\raisebox{\heightof{T}}[0pt][0pt]{\index{Signal@{Signal}!tree\_node.h@{tree\_node.h}}\index{tree\_node.h@{tree\_node.h}!Signal@{Signal}}}\mbox{\Hypertarget{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}\label{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}}
+Signal&\\
+\hline
+
+\end{DoxyEnumFields}
+
+
+Definition at line \mbox{\hyperlink{tree__node_8h_source_l00026}{26}} of file \mbox{\hyperlink{tree__node_8h_source}{tree\+\_\+node.\+h}}.
+
diff --git a/docs/latex/tree__node_8h_source.tex b/docs/latex/tree__node_8h_source.tex
new file mode 100644
index 0000000..d5af660
--- /dev/null
+++ b/docs/latex/tree__node_8h_source.tex
@@ -0,0 +1,125 @@
+\hypertarget{tree__node_8h_source}{}\doxysection{tree\+\_\+node.\+h}
+\mbox{\hyperlink{tree__node_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00001}00001 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00002}00002 \textcolor{comment}{ * @file tree\_node.h}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00003}00003 \textcolor{comment}{ * @brief}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00004}00004 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00005}00005 \textcolor{comment}{ * Created: 2026-\/03-\/13}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00006}00006 \textcolor{comment}{ * Author: Deeaitch (Dim. Himro)}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00007}00007 \textcolor{comment}{ *}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00008}00008 \textcolor{comment}{ * Licensed under the MIT License.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00009}00009 \textcolor{comment}{ * See LICENSE file in the project root for full license text.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00010}00010 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00011}00011 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00012}00012 \textcolor{preprocessor}{\#ifndef TREE\_NODE\_H}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00013}00013 \textcolor{preprocessor}{\#define TREE\_NODE\_H}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00014}00014 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00015}00015 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00016}00016 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00017}00017 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00018}00018 \textcolor{preprocessor}{\#include }}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00019}00019 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00020}00020 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{frame__info_8h}{frame\_info.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00021}00021 \textcolor{preprocessor}{\#include "{}\mbox{\hyperlink{signal__info_8h}{signal\_info.h}}"{}}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00022}00022 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00023}00023 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00024}00024 \textcolor{comment}{ * @brief Type of a tree node.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00025}00025 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00026}\mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{00026}} \textcolor{keyword}{enum class} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00027}00027 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad}{Root}},}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00028}00028 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a}{Frame}},}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00029}00029 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398}{Signal}}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00030}00030 \};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00031}00031 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00032}00032 \textcolor{comment}{/**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00033}00033 \textcolor{comment}{ * @brief Tree node for later use in model/view or other hierarchy consumers.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00034}00034 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00035}\mbox{\hyperlink{classTreeNode}{00035}} \textcolor{keyword}{class }\mbox{\hyperlink{classTreeNode}{TreeNode}} \{}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00036}00036 \textcolor{keyword}{public}:\textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00037}00037 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00038}00038 \textcolor{comment}{ * @brief Create root node.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00039}00039 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00040}00040 \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode}}();}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00041}00041 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00042}00042 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00043}00043 \textcolor{comment}{ * @brief Create frame node.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00044}00044 \textcolor{comment}{ * @param frame Frame payload.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00045}00045 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00046}00046 \textcolor{keyword}{explicit} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} \&frame);}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00047}00047 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00048}00048 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00049}00049 \textcolor{comment}{ * @brief Create signal node.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00050}00050 \textcolor{comment}{ * @param signal Signal payload.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00051}00051 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00052}00052 \textcolor{keyword}{explicit} \mbox{\hyperlink{classTreeNode_a984a98d5ccf7ef1f5a18094c6821f35d}{TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} \&signal);}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00053}00053 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00054}\mbox{\hyperlink{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}{00054}} \mbox{\hyperlink{classTreeNode_a89eb1eb0e25fccaa83c780b85f95b570}{\string~TreeNode}}() = \textcolor{keywordflow}{default};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00055}00055 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00056}\mbox{\hyperlink{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}{00056}} \mbox{\hyperlink{classTreeNode_a4d3054a033accf3e38ea132002fc35ff}{TreeNode}} (\textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&) = \textcolor{keyword}{delete};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00057}\mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{00057}} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&\mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{operator= }}(\textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&) = \textcolor{keyword}{delete};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00058}00058 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00059}\mbox{\hyperlink{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}{00059}} \mbox{\hyperlink{classTreeNode_a35724af755b5d0c43de40a723ef81ec1}{TreeNode}} (\mbox{\hyperlink{classTreeNode}{TreeNode}} \&\&) = \textcolor{keywordflow}{default};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00060}\mbox{\hyperlink{classTreeNode_a88fbcbec9c64d888b19c5edb95059a95}{00060}} \mbox{\hyperlink{classTreeNode}{TreeNode}} \&\mbox{\hyperlink{classTreeNode_ad6ce97dcf532b452d520452b6d000daa}{operator= }}(\mbox{\hyperlink{classTreeNode}{TreeNode}} \&\&) = \textcolor{keywordflow}{default};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00061}00061 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00062}00062 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00063}00063 \textcolor{comment}{ * @brief Add child node.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00064}00064 \textcolor{comment}{ * @param child Child node to add.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00065}00065 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00066}00066 \textcolor{keywordtype}{void} \mbox{\hyperlink{classTreeNode_a6161f2ebb92184eab4215d121870e788}{AddChild}} (std::unique\_ptr child);}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00067}00067 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00068}00068 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00069}00069 \textcolor{comment}{ * @brief Get child count.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00070}00070 \textcolor{comment}{ * @return Number of children.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00071}00071 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00072}00072 std::size\_t \mbox{\hyperlink{classTreeNode_abdd82460187dca8d3e5d66f5d5c529ea}{GetChildCount}}() \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00073}00073 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00074}00074 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00075}00075 \textcolor{comment}{ * @brief Get child by index.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00076}00076 \textcolor{comment}{ * @param index Child index.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00077}00077 \textcolor{comment}{ * @return Child pointer or nullptr if index is invalid.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00078}00078 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00079}00079 \textcolor{keyword}{const} \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{GetChild}} (std::size\_t index) \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00080}00080 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00081}00081 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00082}00082 \textcolor{comment}{ * @brief Get mutable child by index.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00083}00083 \textcolor{comment}{ * @param index Child index.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00084}00084 \textcolor{comment}{ * @return Child pointer or nullptr if index is invalid.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00085}00085 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00086}00086 \mbox{\hyperlink{classTreeNode}{TreeNode}} *\mbox{\hyperlink{classTreeNode_a4727ff801a2d1b9323c5ae50a35457a6}{GetChild}} (std::size\_t index);}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00087}00087 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00088}00088 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00089}00089 \textcolor{comment}{ * @brief Get node type.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00090}00090 \textcolor{comment}{ * @return Node type.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00091}00091 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00092}00092 \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \mbox{\hyperlink{classTreeNode_afa2f4b0aafa12d3d41ed00df8e0250c9}{GetType}}() \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00093}00093 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00094}00094 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00095}00095 \textcolor{comment}{ * @brief Get display name.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00096}00096 \textcolor{comment}{ * @return Node name.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00097}00097 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00098}00098 \textcolor{keyword}{const} std::string \&\mbox{\hyperlink{classTreeNode_aaac5b8d9dc9e5ae1f367d1adbcf20e18}{GetName}}() \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00099}00099 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00100}00100 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00101}00101 \textcolor{comment}{ * @brief Get frame payload if node is frame.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00102}00102 \textcolor{comment}{ * @return Pointer to frame info or nullptr.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00103}00103 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00104}00104 \textcolor{keyword}{const} \mbox{\hyperlink{structFrameInfo}{FrameInfo}} *\mbox{\hyperlink{classTreeNode_afc503b40004764163605d6dbdb4ef811}{GetFrame}}() \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00105}00105 \textcolor{comment}{}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00106}00106 \textcolor{comment}{ /**}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00107}00107 \textcolor{comment}{ * @brief Get signal payload if node is signal.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00108}00108 \textcolor{comment}{ * @return Pointer to signal info or nullptr.}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00109}00109 \textcolor{comment}{ */}}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00110}00110 \textcolor{keyword}{const} \mbox{\hyperlink{structSignalInfo}{SignalInfo}} *\mbox{\hyperlink{classTreeNode_a226518612d0d00b5988a2c44fc21d3f1}{GetSignal}}() \textcolor{keyword}{const};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00111}00111 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00112}00112 \textcolor{keyword}{private}:}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00113}\mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{00113}} \mbox{\hyperlink{tree__node_8h_acac9cbaeea226ed297804c012dc12b16}{NodeType}} \mbox{\hyperlink{classTreeNode_a04bccab9e60a6a78777cd7dfec52d224}{m\_type}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00114}\mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{00114}} std::string \mbox{\hyperlink{classTreeNode_ac0ddcb8370e6b51e2d3de6b8211a47f8}{m\_name}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00115}\mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{00115}} std::vector > \mbox{\hyperlink{classTreeNode_a1bd61f40df6d36e61021063e3816a351}{m\_children}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00116}\mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{00116}} std::unique\_ptr \mbox{\hyperlink{classTreeNode_a77ee6aa80774d67ba442a66b45c798c2}{m\_frame}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00117}\mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{00117}} std::unique\_ptr \mbox{\hyperlink{classTreeNode_ae658355007bc9303f7bfae3bb3ec8386}{m\_signal}};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00118}00118 \};}
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00119}00119 }
+\DoxyCodeLine{\Hypertarget{tree__node_8h_source_l00120}00120 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* TREE\_NODE\_H */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}