diff --git a/.gitignore b/.gitignore index b08cda4..671906a 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,3 @@ misc/ .flooignore node_modules/ examples/todomvc/.idea/ -test-resources/*.edn diff --git a/src/day8/re_frame/trace.cljs b/src/day8/re_frame/trace.cljs index 5e917be..d515bd0 100644 --- a/src/day8/re_frame/trace.cljs +++ b/src/day8/re_frame/trace.cljs @@ -77,7 +77,7 @@ (defonce real-custom-wrapper reagent.impl.component/custom-wrapper) (defonce real-next-tick reagent.impl.batching/next-tick) (defonce real-schedule reagent.impl.batching/schedule) -(defonce schedule-fn-scheduled? (atom false)) +(defonce do-after-render-trace-scheduled? (atom false)) (defn monkey-patch-reagent [] (let [#_#_real-renderer reagent.impl.component/do-render @@ -112,18 +112,39 @@ (set! reagent.impl.batching/next-tick (fn [f] + ;; Schedule a trace to be emitted after a render if there is nothing else scheduled after that render. + ;; This signals the end of the epoch. + + #_ (swap! do-after-render-trace-scheduled? + (fn [scheduled?] + (js/console.log "Setting up scheduled after" scheduled?) + (if scheduled? + scheduled? + (do (reagent.impl.batching/do-after-render ;; a do-after-flush would probably be a better spot to put this if it existed. + (fn [] + (js/console.log "Do after render" reagent.impl.batching/render-queue) + (reset! do-after-render-trace-scheduled? false) + (when (false? (.-scheduled? reagent.impl.batching/render-queue)) + (trace/with-trace {:op-type :reagent/quiescent})))) + true)))) (real-next-tick (fn [] (trace/with-trace {:op-type :raf} (f) - (trace/with-trace {:op-type :raf-end})))))) + (trace/with-trace {:op-type :raf-end}) + (js/console.log "Do after render" reagent.impl.batching/render-queue) + (js/console.log "Component queue" (.-componentQueue reagent.impl.batching/render-queue) "after render" (.-afterRender reagent.impl.batching/render-queue)) + (when (false? (.-scheduled? reagent.impl.batching/render-queue)) + (trace/with-trace {:op-type :reagent/quiescent})) + + ))))) #_(set! reagent.impl.batching/schedule (fn [] (reagent.impl.batching/do-after-render (fn [] - (when @schedule-fn-scheduled? + (when @do-after-render-trace-scheduled? (trace/with-trace {:op-type :do-after-render}) - (reset! schedule-fn-scheduled? false)))) + (reset! do-after-render-trace-scheduled? false)))) (real-schedule))))) diff --git a/src/day8/re_frame/trace/metamorphic.cljc b/src/day8/re_frame/trace/metamorphic.cljc index 9a57e16..a15ba42 100644 --- a/src/day8/re_frame/trace/metamorphic.cljc +++ b/src/day8/re_frame/trace/metamorphic.cljc @@ -1,121 +1,194 @@ (ns day8.re-frame.trace.metamorphic (:require [metamorphic.api :as m] [metamorphic.runtime :as rt] - #?(:clj + #?(:clj [metamorphic.viz :as v]))) -;; Next, we define predicate functions that take exactly 4 arguments. -;; These predicates are obviously incredibly boring, but they help -;; save your brain power for the real concepts. +;; What starts an epoch? -;; Each predicate will receive each event as it arrives, a history (which we'll discuss later), -;; the entire pattern sequence, and the particular pattern that this predicate -;; is being used in. This is helpful for parameterizing a predicate. +;;; idle -> dispatch -> running +;;; running -> dispatch -> handling new event -(defn a? [event history pattern-sequence pattern] - (= event "a")) +;; What ends an epoch? -(defn b? [event history pattern-sequence pattern] - (= event "b")) +;;; the start of a new epoch +;;; a Reagent animation frame ending AND nothing else being scheduled -(defn c? [event history pattern-sequence pattern] - (= event "c")) - -;; Now let's create a pattern sequence. We're looking for "a", "b", then "c". -;; This pattern says: find "a", then immediately look for "b". After you find "b", -;; look for "c", but if there's something that doesn't match in the middle, that's -;; okay. The relaxation of looking for "c" is called a contiguity constraint, denoted -;; by "followed-by" instead of "next". - -(defn run-test [] - (let [runtime (-> (m/new-pattern-sequence "a b c") - (m/begin "a" a?) - (m/next "b" b?) - (m/followed-by "c" c?) - (rt/initialize-runtime)) - events ["a" "b" "q" "c" "z" "a" "b" "d" "x" "c"]] - (:matches (reduce rt/evaluate-event runtime events)))) +;; Slight wrinkles +;;; Any renders that run between epochs deserve their own epoch really. +;;; Dispatch-sync's ;;; -(defn new-epoch-started? [event history pattern-sequence pattern] - (and (= :re-frame.router/fsm-trigger (:op-type event)) +; +;(defn add-event-from-idle? [event history pattern-sequence pattern] +; #_(println @history event) +; +; (and (= :re-frame.router/fsm-trigger (:op-type event)) +; (= (:operation event) +; [:idle :add-event]))) +; +;(defn event-run? [event history pattern-sequence pattern] +; (= :event (:op-type event))) +; +;(defn epoch-started? [event history pattern-sequence pattern] +; (or (add-event-from-idle? event history pattern-sequence pattern) +; (and (event-run? event history pattern-sequence pattern) +; (empty? @history)))) +; +(defn fsm-trigger? [event] + (= :re-frame.router/fsm-trigger (:op-type event))) +; +;(defn redispatched-event? [event history pattern-sequence pattern] +; (and (fsm-trigger? event) +; (= (:operation event) +; [:running :add-event]))) +; +;(defn router-scheduled? [event history pattern-sequence pattern] +; (and (fsm-trigger? event) +; (= (:operation event) +; [:running :finish-run]) +; (= :running (get-in event [:tags :current-state])) +; (= :scheduled (get-in event [:tags :new-state])))) +; +;(defn router-finished? [event history pattern-sequence pattern] +; (and (fsm-trigger? event) +; (= (:operation event) +; [:running :finish-run]) +; (= :running (get-in event [:tags :current-state])) +; (= :idle (get-in event [:tags :new-state])))) +; +;(defn quiescent? [event _ _ _] +; (= :reagent/quiescent (:op-type event))) +; +;(defn epoch-ended? [event history pattern-sequence pattern] +; (or (quiescent? event history pattern-sequence pattern) +; (epoch-started? event history pattern-sequence pattern))) +; +(defn run-queue? [event] + (and (fsm-trigger? event) (= (:operation event) - [:idle :add-event]))) - -(defn event-run? [event history pattern-sequence pattern] - (= :event (:op-type event))) - -(defn redispatched-event? [event history pattern-sequence pattern] - (and (= :re-frame.router/fsm-trigger (:op-type event)) - (= (:operation event) - [:running :add-event]))) - -(defn router-scheduled? [event history pattern-sequence pattern] - (and (= :re-frame.router/fsm-trigger (:op-type event)) - (= (:operation event) - [:running :finish-run]) - (= :running (get-in event [:tags :current-state])) - (= :scheduled (get-in event [:tags :new-state])))) - -(defn router-finished? [event history pattern-sequence pattern] - (and (= :re-frame.router/fsm-trigger (:op-type event)) - (= (:operation event) - [:running :finish-run]) - (= :running (get-in event [:tags :current-state])) - (= :idle (get-in event [:tags :new-state])))) - -(defn request-animation-frame? [event history pattern-sequence pattern] - (= :raf (:op-type event))) - -(defn request-animation-frame-end? [event history pattern-sequence pattern] - (= :raf-end (:op-type event))) - - -#?(:clj (defn trace-events [] (->> (slurp "test-resources/events2.edn") - (clojure.edn/read-string {:readers {'utc identity - 'object (fn [x] "")}}) - (sort-by :id)))) - - + [:scheduled :run-queue]))) +; +;(defn request-animation-frame? [event history pattern-sequence pattern] +; (= :raf (:op-type event))) +; +;(defn request-animation-frame-end? [event history pattern-sequence pattern] +; (= :raf-end (:op-type event))) +; (defn summarise-event [ev] (dissoc ev :start :duration :end :child-of)) (defn summarise-match [match] (map summarise-event match)) +; +(defn beginning-id [match] + (:id (first match))) -#?(:clj - (defn parse-events [] - #_ (let [runtime (-> (m/new-pattern-sequence "simple traces") - (m/begin "new-epoch-started" new-epoch-started?) - #_(m/followed-by "redispatched-event" redispatched-event? {:optional? true}) - #_(m/followed-by "router-scheduled" router-scheduled? {:optional? true}) - (m/followed-by "event-run" event-run?) - (m/followed-by "router-finished" router-finished?) - (m/followed-by "raf" request-animation-frame?) - (m/followed-by "raf-end" request-animation-frame-end?) - (rt/initialize-runtime)) - events (trace-events) - rt (reduce rt/evaluate-event runtime events)] - #_(println "Count" - (count (:matches rt)) - (map count (:matches rt))) - (map summarise-match (:matches rt))))) +(defn ending-id [match] + (:id (last match))) +; +;(defn parse-traces-metam +; "Returns a metamorphic runtime" +; [traces] +; (let [runtime (-> (m/new-pattern-sequence "simple traces") +; (m/begin "new-epoch-started" epoch-started?) +; #_(m/followed-by "run-queue" run-queue? {:optional? true}) +; ;(m/followed-by "event-run" event-run?) +; #_(m/followed-by "router-finished" router-finished?) +; ;(m/followed-by "raf" request-animation-frame?) +; ;(m/followed-by "raf-end" request-animation-frame-end?) +; (m/followed-by "epoch-ended" epoch-ended?) +; (rt/initialize-runtime)) +; rt (reduce rt/evaluate-event runtime traces)] +; #_(println "Count" +; (count (:matches rt)) +; (map count (:matches rt))) +; #_(map summarise-match (:matches rt)) +; rt)) -(defn parse-traces - "Returns a metamorphic runtime" - [traces] - (let [runtime (-> (m/new-pattern-sequence "simple traces") - (m/begin "new-epoch-started" new-epoch-started?) - (m/followed-by "event-run" event-run?) - (m/followed-by "router-finished" router-finished?) - (m/followed-by "raf" request-animation-frame?) - (m/followed-by "raf-end" request-animation-frame-end?) - (rt/initialize-runtime)) - rt (reduce rt/evaluate-event runtime traces)] - #_(println "Count" - (count (:matches rt)) - (map count (:matches rt))) - #_(map summarise-match (:matches rt)) - rt)) +;;;;;; + +;; TODO: this needs to be included too as a starting point. +(defn add-event-from-idle? [event] + (and (= :re-frame.router/fsm-trigger (:op-type event)) + (= (:operation event) + [:idle :add-event]))) + +(defn event-run? [event] + (= :event (:op-type event))) + +(defn start-of-epoch? + "Detects the start of a re-frame epoch + + Normally an epoch would always start with the queue being run, but with a dispatch-sync, the event is run directly." + [event] + (or (run-queue? event) + (event-run? event))) + +(defn start-of-epoch-and-prev-end? + "Detects that a new epoch has started and that the previous one ended on the previous event. + + If multiple events are dispatched while processing the first event, each one is considered its + own epoch." + [event state] + (or (run-queue? event) + ;; An event ran, and the previous event was not + ;; a run-queue. + (and (event-run? event) + (not (run-queue? (:previous-event state)))))) + +(defn quiescent? [event] + (= :reagent/quiescent (:op-type event))) + +(defn parse-traces [traces] + (let [partitions (reduce + (fn [state event] + (let [current-match (:current-match state) + previous-event (:previous-event state) + no-match? (nil? current-match)] + (-> (cond + + ;; No current match yet, check if this is the start of an epoch + no-match? + (if (start-of-epoch? event) + (assoc state :current-match [event]) + state) + + ;; We are in an epoch match, and reagent has gone to a quiescent state + (quiescent? event) + (-> state + (update :partitions conj (conj current-match event)) + (assoc :current-match nil)) + + ;; We are in an epoch match, and we have started a new epoch + ;; The previously seen event was the last event of the old epoch, + ;; and we need to start a new one from this event. + (start-of-epoch-and-prev-end? event state) + (-> state + (update :partitions conj (conj current-match previous-event)) + (assoc :current-match [event])) + + (event-run? event) + (update state :current-match conj event) + + + :else + state + ;; Add a timeout/warning if a match goes on for more than a second? + + ) + (assoc :previous-event event)))) + {:current-match nil + :previous-event nil + :partitions []} + traces) + matches (:partitions partitions)] + #?(:cljs (js/console.log "Partitions:" partitions)) + {:matches matches})) + +(defn matched-event [match] + (->> match + (filter event-run?) + (first))) diff --git a/src/day8/re_frame/trace/styles.cljs b/src/day8/re_frame/trace/styles.cljs index 70cef53..27244db 100644 --- a/src/day8/re_frame/trace/styles.cljs +++ b/src/day8/re_frame/trace/styles.cljs @@ -308,7 +308,9 @@ [:span.event-header {:color common/text-color :background-color common/standard-background-color :padding (px 5) - :font-weight "600"}] + :font-weight "600" + ;; TODO: figure out how to hide long events + :text-overflow "ellipsis"}] ] [(s/& :.external-window) {:display "flex" :height (percent 100) diff --git a/src/day8/re_frame/trace/view/debug.cljs b/src/day8/re_frame/trace/view/debug.cljs index f3bb2b0..da6d6a2 100644 --- a/src/day8/re_frame/trace/view/debug.cljs +++ b/src/day8/re_frame/trace/view/debug.cljs @@ -14,6 +14,7 @@ [rc/label :label "Matches"] (for [match (:matches @(rf/subscribe [:epochs/epoch-root]))] + ^{:key (:id (first match))} [rc/v-box :style {:border "1px solid black"} :children (doall (map (fn [event] [rc/label :label (prn-str event)]) (metam/summarise-match match))) diff --git a/src/day8/re_frame/trace/view/traces.cljs b/src/day8/re_frame/trace/view/traces.cljs index 99c5d2d..095067c 100644 --- a/src/day8/re_frame/trace/view/traces.cljs +++ b/src/day8/re_frame/trace/view/traces.cljs @@ -88,12 +88,12 @@ input-error (r/atom false) categories (rf/subscribe [:traces/categories]) trace-detail-expansions (rf/subscribe [:traces/expansions]) - beginning (rf/subscribe [:epochs/beginning-trace-id]) - end (rf/subscribe [:epochs/ending-trace-id]) - traces (rf/subscribe [:traces/current-event-traces])] + beginning (rf/subscribe [:epochs/beginning-trace-id]) + end (rf/subscribe [:epochs/ending-trace-id]) + current-traces (rf/subscribe [:traces/current-event-traces])] (fn [] (let [toggle-category-fn #(rf/dispatch [:traces/toggle-categories %]) - visible-traces (cond->> @traces + visible-traces (cond->> #_@current-traces @traces ;; Remove cached subscriptions. Could add this back in as a setting later ;; but it's pretty low signal/noise 99% of the time. true (remove (fn [trace] (and (= :sub/create (:op-type trace)) @@ -161,10 +161,10 @@ :on-click #(rf/dispatch [:traces/reset-filter-items])} (when (pos? (count @filter-items)) (str (count visible-traces) " of ")) - (str (count @traces))] + (str (count @current-traces))] " traces " - (when (pos? (count @traces)) - [:span "(" [:button.text-button {:on-click #(do (trace/reset-tracing!) (reset! traces []))} "clear"] ")"])] + (when (pos? (count @current-traces)) + [:span "(" [:button.text-button {:on-click #(do (trace/reset-tracing!) (reset! current-traces []))} "clear"] ")"])] [:th {:style {:text-align "right"}} "meta"]] [:tbody (render-traces visible-traces filter-items filter-input trace-detail-expansions)]]]])))) diff --git a/test-resources/app-trace1.edn b/test-resources/app-trace1.edn new file mode 100644 index 0000000..bde5ecb --- /dev/null +++ b/test-resources/app-trace1.edn @@ -0,0 +1 @@ +[{:id 1, :operation :bootstrap, :op-type :event, :tags {:event [:bootstrap]}, :child-of nil, :start 2897.5700000000006, :duration 36.46499999999969, :end 2934.0400000000004} {:id 2, :operation [:idle :add-event], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :idle, :new-state :scheduled}, :child-of 1, :start 2933.815, :duration 0.125, :end 2933.945} {:id 3, :operation "acme.myapp.main.main", :op-type :render, :tags {:component-path "acme.myapp.main.main", :reaction "rx65", :input-signals ("ra93" "rx64")}, :child-of nil, :start 2974.9950000000003, :duration 1.9349999999999454, :end 2976.935} {:id 4, :operation :boot-state, :op-type :sub/create, :tags {:query-v [:boot-state], :cached? false, :reaction "rx64"}, :child-of 3, :start 2975.0850000000005, :duration 0.5399999999999636, :end 2975.63} {:id 5, :operation :boot-state, :op-type :sub/run, :tags {:query-v [:boot-state], :reaction "rx64", :input-signals (nil nil nil nil nil), :value :booting}, :child-of 3, :start 2975.8650000000002, :duration 0.1000000000003638, :end 2975.9700000000003} {:id 6, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of nil, :start 2977.275, :duration 3.4600000000000364, :end 2980.77} {:id 7, :operation "acme.myapp.main.busy_panel", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel", :reaction "rx67", :input-signals ("ra93" "rx66" "rx66")}, :child-of nil, :start 2981.4800000000005, :duration 1.974999999999909, :end 2983.4600000000005} {:id 8, :operation :progress, :op-type :sub/create, :tags {:query-v [:progress], :cached? false, :reaction "rx66"}, :child-of 7, :start 2981.565, :duration 0.5750000000002728, :end 2982.1600000000003} {:id 9, :operation :progress, :op-type :sub/run, :tags {:query-v [:progress], :reaction "rx66", :input-signals (nil nil nil nil nil), :value {:complete? false, :description "Starting MyApp v0.0.1-SNAPSHOT...", :event :bootstrap}}, :child-of 7, :start 2982.4100000000003, :duration 0.1799999999998363, :end 2982.61} {:id 10, :operation "re_com.modal_panel.modal_panel", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel", :reaction nil, :input-signals nil}, :child-of nil, :start 2983.8250000000003, :duration 1.625, :end 2985.4550000000004} {:id 11, :operation "re_com.box.border", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border", :reaction nil, :input-signals nil}, :child-of nil, :start 2986.145, :duration 1.3350000000000364, :end 2987.48} {:id 12, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of nil, :start 2987.9350000000004, :duration 1.6549999999997453, :end 2989.5950000000003} {:id 13, :operation "re_com.misc.throbber", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber", :reaction nil, :input-signals nil}, :child-of nil, :start 2990.2650000000003, :duration 0.9250000000001819, :end 2991.195} {:id 14, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box", :reaction nil, :input-signals nil}, :child-of nil, :start 2991.7250000000004, :duration 1.6950000000001637, :end 2993.425} {:id 15, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2994.03, :duration 0.27999999999974534, :end 2994.3150000000005} {:id 16, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2994.8100000000004, :duration 0.125, :end 2994.94} {:id 17, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2995.4, :duration 0.1000000000003638, :end 2995.505} {:id 18, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2996.0250000000005, :duration 0.0999999999994543, :end 2996.125} {:id 19, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2996.515, :duration 0.08500000000049113, :end 2996.6150000000002} {:id 20, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2996.9400000000005, :duration 0.08499999999958163, :end 2997.03} {:id 21, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2997.52, :duration 0.09000000000014552, :end 2997.61} {:id 22, :operation "reagent1", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil, :input-signals nil}, :child-of nil, :start 2998.5750000000003, :duration 0.10500000000001819, :end 2998.6800000000003} {:id 23, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of nil, :start 2999.2150000000006, :duration 1.0799999999999272, :end 3000.3} {:id 24, :operation "re_com.text.label", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.text.label", :reaction nil, :input-signals nil}, :child-of nil, :start 3000.9, :duration 0.6400000000003274, :end 3001.545} {:id 25, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.text.label > re_com.box.box", :reaction nil, :input-signals nil}, :child-of nil, :start 3001.775, :duration 0.8400000000001455, :end 3002.6200000000003} {:id 26, :operation "acme.myapp.main.app_notification", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_notification", :reaction "rx69", :input-signals ("ra93" "rx68")}, :child-of nil, :start 3003.3800000000006, :duration 0.9799999999995634, :end 3004.3650000000002} {:id 27, :operation :app-notification, :op-type :sub/create, :tags {:query-v [:app-notification], :cached? false, :reaction "rx68"}, :child-of 26, :start 3003.4300000000003, :duration 0.2899999999999636, :end 3003.7250000000004} {:id 28, :operation :app-notification, :op-type :sub/run, :tags {:query-v [:app-notification], :reaction "rx68", :input-signals (nil nil nil nil nil), :value nil}, :child-of 26, :start 3003.885, :duration 0.09500000000025466, :end 3003.985} {:id 29, :operation nil, :op-type :raf, :tags nil, :child-of nil, :start 3025.9300000000003, :duration 5.739999999999782, :end 3031.67} {:id 30, :operation "acme.myapp.main.main", :op-type :render, :tags {:component-path "acme.myapp.main.main", :reaction "rx65", :input-signals ("ra93" "rx64")}, :child-of 29, :start 3026.2700000000004, :duration 0.45499999999992724, :end 3026.73} {:id 31, :operation :boot-state, :op-type :sub/create, :tags {:query-v [:boot-state], :cached? true, :reaction "rx64"}, :child-of 30, :start 3026.3450000000003, :duration 0.13500000000021828, :end 3026.485} {:id 32, :operation "acme.myapp.main.busy_panel", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel", :reaction "rx67", :input-signals ("rx66" "rx66")}, :child-of 29, :start 3027.07, :duration 0.2699999999999818, :end 3027.34} {:id 33, :operation nil, :op-type :raf-end, :tags nil, :child-of 29, :start 3027.51, :duration 0.005000000000109139, :end 3027.5150000000003} {:id 34, :operation nil, :op-type :reagent/quiescent, :tags nil, :child-of 29, :start 3031.6050000000005, :duration 0, :end 3031.61} {:id 35, :operation [:scheduled :run-queue], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :scheduled, :new-state :running}, :child-of nil, :start 3033.5650000000005, :duration 1.1700000000000728, :end 3034.7400000000002} {:id 36, :operation :acme.myapp.events/boot-flow, :op-type :event, :tags {:event [:acme.myapp.events/boot-flow :setup]}, :child-of 35, :start 3033.7850000000003, :duration 0.6649999999999636, :end 3034.46} {:id 37, :operation [:running :add-event], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :running}, :child-of 36, :start 3034.19, :duration 0.07000000000016371, :end 3034.2700000000004} {:id 38, :operation [:running :finish-run], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :scheduled}, :child-of 35, :start 3034.55, :duration 0.13000000000010914, :end 3034.685} {:id 39, :operation [:scheduled :run-queue], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :scheduled, :new-state :running}, :child-of nil, :start 3034.815, :duration 3.269999999999982, :end 3038.0900000000006} {:id 40, :operation :acme.myapp.events/init-db, :op-type :event, :tags {:event [:acme.myapp.events/init-db]}, :child-of 39, :start 3034.9150000000004, :duration 2.7400000000002365, :end 3037.6600000000003} {:id 41, :operation [:running :add-event], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :running}, :child-of 39, :start 3037.8, :duration 0.08500000000003638, :end 3037.885} {:id 42, :operation [:running :finish-run], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :scheduled}, :child-of 39, :start 3037.9600000000005, :duration 0.09499999999979991, :end 3038.0550000000003} {:id 43, :operation [:scheduled :run-queue], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :scheduled, :new-state :running}, :child-of nil, :start 3038.135, :duration 1.0299999999997453, :end 3039.1700000000005} {:id 44, :operation :acme.myapp.events/boot-flow, :op-type :event, :tags {:event [:acme.myapp.events/boot-flow [:acme.myapp.events/init-db]]}, :child-of 43, :start 3038.205, :duration 0.7950000000000728, :end 3039} {:id 45, :operation [:running :add-event], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :running}, :child-of 44, :start 3038.55, :duration 0.04500000000007276, :end 3038.5950000000003} {:id 46, :operation [:running :add-event], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :running}, :child-of 44, :start 3038.7100000000005, :duration 0.0799999999994725, :end 3038.7950000000005} {:id 47, :operation [:running :finish-run], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :scheduled}, :child-of 43, :start 3039.045, :duration 0.08000000000038199, :end 3039.13} {:id 48, :operation [:scheduled :run-queue], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :scheduled, :new-state :running}, :child-of nil, :start 3039.2300000000005, :duration 18.95999999999958, :end 3058.1950000000006} {:id 49, :operation :acme.myapp.events/start-intercom, :op-type :event, :tags {:event [:acme.myapp.events/start-intercom]}, :child-of 48, :start 3039.3050000000003, :duration 4.4050000000002, :end 3043.7100000000005} {:id 50, :operation :acme.myapp.events/success-bootstrap, :op-type :event, :tags {:event [:acme.myapp.events/success-bootstrap]}, :child-of 48, :start 3043.7900000000004, :duration 14.004999999999654, :end 3057.795} {:id 51, :operation [:running :finish-run], :op-type :re-frame.router/fsm-trigger, :tags {:current-state :running, :new-state :idle}, :child-of 48, :start 3058.07, :duration 0.08000000000038199, :end 3058.1500000000005} {:id 52, :operation nil, :op-type :raf, :tags nil, :child-of nil, :start 3153.215, :duration 93.58500000000004, :end 3246.83} {:id 53, :operation :boot-state, :op-type :sub/run, :tags {:query-v [:boot-state], :reaction "rx64", :input-signals (nil nil nil nil nil), :value :boot-success}, :child-of 52, :start 3153.2950000000005, :duration 0.24999999999954525, :end 3153.56} {:id 54, :operation :progress, :op-type :sub/run, :tags {:query-v [:progress], :reaction "rx66", :input-signals (nil nil nil nil nil), :value {:complete? true, :description nil, :event nil}}, :child-of 52, :start 3153.8350000000005, :duration 1.3299999999999272, :end 3155.175} {:id 55, :operation :app-notification, :op-type :sub/run, :tags {:query-v [:app-notification], :reaction "rx68", :input-signals (nil nil nil nil nil), :value nil}, :child-of 52, :start 3155.3500000000004, :duration 0.09499999999979991, :end 3155.4550000000004} {:id 56, :operation "acme.myapp.main.main", :op-type :render, :tags {:component-path "acme.myapp.main.main", :reaction "rx65", :input-signals ("ra93" "rx64")}, :child-of 52, :start 3155.8, :duration 0.4050000000002001, :end 3156.2150000000006} {:id 57, :operation :boot-state, :op-type :sub/create, :tags {:query-v [:boot-state], :cached? true, :reaction "rx64"}, :child-of 56, :start 3155.85, :duration 0.11500000000023647, :end 3155.9700000000003} {:id 58, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3156.4400000000005, :duration 6.454999999999927, :end 3162.9} {:id 59, :operation "acme.myapp.main.app_content", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content", :reaction "rx77", :input-signals ("ra93" "ra93" "ra93" "ra93" "ra93" "ra93" "rx71" "rx71" "rx73" "ra94" "rx70")}, :child-of 52, :start 3163.4050000000007, :duration 4.0549999999993815, :end 3167.46} {:id 60, :operation :navigation/page, :op-type :sub/create, :tags {:query-v [:navigation/page], :cached? false, :reaction "rx70"}, :child-of 59, :start 3163.4800000000005, :duration 0.2849999999998545, :end 3163.7700000000004} {:id 61, :operation :navigation/visible?, :op-type :sub/create, :tags {:query-v [:navigation/visible?], :cached? false, :reaction "rx71"}, :child-of 59, :start 3163.905, :duration 0.21000000000003638, :end 3164.1150000000002} {:id 62, :operation :system-name, :op-type :sub/create, :tags {:query-v [:system-name], :cached? false, :reaction "rx73"}, :child-of 59, :start 3164.225, :duration 0.41000000000030923, :end 3164.635} {:id 63, :operation :site-config, :op-type :sub/create, :tags {:query-v [:site-config], :cached? false, :reaction "rx72"}, :child-of 62, :start 3164.3200000000006, :duration 0.11499999999932697, :end 3164.435} {:id 64, :operation :undos?, :op-type :sub/create, :tags {:query-v [:undos?], :cached? false, :reaction "rx74"}, :child-of 59, :start 3164.7450000000003, :duration 0.169999999999618, :end 3164.915} {:id 65, :operation :redos?, :op-type :sub/create, :tags {:query-v [:redos?], :cached? false, :reaction "rx75"}, :child-of 59, :start 3165.005, :duration 0.5000000000004547, :end 3165.51} {:id 66, :operation :navigation/visible?, :op-type :sub/run, :tags {:query-v [:navigation/visible?], :reaction "rx71", :input-signals (nil nil), :value true}, :child-of 59, :start 3165.71, :duration 1.0850000000004911, :end 3166.8} {:id 67, :operation :navigation/page, :op-type :sub/create, :tags {:query-v [:navigation/page], :cached? true, :reaction "rx70"}, :child-of 66, :start 3165.8250000000003, :duration 0.05999999999994543, :end 3165.885} {:id 68, :operation :navigation/page, :op-type :sub/run, :tags {:query-v [:navigation/page], :reaction "rx70", :input-signals (nil nil nil nil nil), :value :main/define}, :child-of 66, :start 3166.03, :duration 0.04500000000007276, :end 3166.0750000000003} {:id 69, :operation :section1/editing-sav, :op-type :sub/create, :tags {:query-v [:section1/editing-sav], :cached? false, :reaction "rx76"}, :child-of 66, :start 3166.29, :duration 0.13500000000021828, :end 3166.425} {:id 70, :operation :section1/editing-sav, :op-type :sub/run, :tags {:query-v [:section1/editing-sav], :reaction "rx76", :input-signals (nil nil nil nil nil), :value nil}, :child-of 66, :start 3166.5550000000003, :duration 0.04500000000007276, :end 3166.6000000000004} {:id 71, :operation :system-name, :op-type :sub/run, :tags {:query-v [:system-name], :reaction "rx73", :input-signals (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil), :value "MyApp"}, :child-of 59, :start 3166.9300000000003, :duration 0.22499999999990905, :end 3167.1650000000004} {:id 72, :operation :site-config, :op-type :sub/run, :tags {:query-v [:site-config], :reaction "rx72", :input-signals (nil nil nil nil nil), :value #object[acme.system-configuration.Configuration]}, :child-of 71, :start 3166.9500000000003, :duration 0.03500000000030923, :end 3166.9900000000002} {:id 73, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3167.7000000000003, :duration 1.2399999999997817, :end 3168.94} {:id 74, :operation "re_com.box.scroller", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller", :reaction nil, :input-signals nil}, :child-of 52, :start 3169.315, :duration 0.9950000000003456, :end 3170.3150000000005} {:id 75, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3170.6150000000002, :duration 1.1599999999998545, :end 3171.78} {:id 76, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3172.105, :duration 1.1650000000004184, :end 3173.2700000000004} {:id 77, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > re_com.box.h_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3173.7400000000002, :duration 0.4050000000002001, :end 3174.1450000000004} {:id 78, :operation "re_com.text.label", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > re_com.box.h_box > re_com.text.label", :reaction nil, :input-signals nil}, :child-of 52, :start 3176.4500000000003, :duration 0.5599999999999454, :end 3177.01} {:id 79, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > re_com.box.h_box > re_com.text.label > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3177.3100000000004, :duration 0.900000000000091, :end 3178.2100000000005} {:id 80, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3178.7750000000005, :duration 0.5099999999997635, :end 3179.2900000000004} {:id 81, :operation "acme.myapp.main.sidepanel_tab_list", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list", :reaction "rx78", :input-signals ("ra93" "rx72" "ra93")}, :child-of 52, :start 3179.755, :duration 1.0150000000003274, :end 3180.7700000000004} {:id 82, :operation :site-config, :op-type :sub/create, :tags {:query-v [:site-config], :cached? true, :reaction "rx72"}, :child-of 81, :start 3179.8100000000004, :duration 0.125, :end 3179.9350000000004} {:id 83, :operation :navigation/page, :op-type :sub/create, :tags {:query-v [:navigation/page], :cached? true, :reaction "rx70"}, :child-of 81, :start 3180.1450000000004, :duration 0.0749999999998181, :end 3180.225} {:id 84, :operation "acme.myapp.components.nav_tabs.tabs_v", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v", :reaction "rx79", :input-signals ("rx70" "ra95" "ra95" "ra95" "ra95")}, :child-of 52, :start 3181.105, :duration 1.3350000000000364, :end 3182.44} {:id 85, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3183.0900000000006, :duration 1.0199999999999818, :end 3184.1150000000002} {:id 86, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3184.6800000000003, :duration 0.7299999999995634, :end 3185.41} {:id 87, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3185.9050000000007, :duration 0.6599999999998545, :end 3186.57} {:id 88, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3187.01, :duration 0.6849999999999454, :end 3187.7000000000003} {:id 89, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3188.0750000000003, :duration 0.30500000000029104, :end 3188.385} {:id 90, :operation "acme.myapp.main.system_version", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.system_version", :reaction "rx80", :input-signals ("ra93" "rx73" "ra93" "rx72")}, :child-of 52, :start 3188.635, :duration 0.44499999999970896, :end 3189.0850000000005} {:id 91, :operation :system-name, :op-type :sub/create, :tags {:query-v [:system-name], :cached? true, :reaction "rx73"}, :child-of 90, :start 3188.675, :duration 0.05999999999994543, :end 3188.7400000000002} {:id 92, :operation :site-config, :op-type :sub/create, :tags {:query-v [:site-config], :cached? true, :reaction "rx72"}, :child-of 90, :start 3188.84, :duration 0.04500000000007276, :end 3188.8900000000003} {:id 93, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.system_version > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3189.2650000000003, :duration 0.724999999999909, :end 3189.9950000000003} {:id 94, :operation "re_com.text.label", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.system_version > re_com.box.h_box > re_com.text.label", :reaction nil, :input-signals nil}, :child-of 52, :start 3190.26, :duration 0.36999999999989086, :end 3190.63} {:id 95, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.system_version > re_com.box.h_box > re_com.text.label > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3190.8450000000003, :duration 0.9299999999998363, :end 3191.8} {:id 96, :operation "re_com.box.scroller", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller", :reaction nil, :input-signals nil}, :child-of 52, :start 3192.2200000000003, :duration 0.7799999999997453, :end 3193} {:id 97, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3193.2500000000005, :duration 0.7600000000002183, :end 3194.0100000000007} {:id 98, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3196.15, :duration 0.9700000000002547, :end 3197.1200000000003} {:id 99, :operation "acme.myapp.panels.section1.view.panel", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel", :reaction "rx85", :input-signals ("ra93" "ra93" "ra93" "ra93" "ra93" "ra93" "rx76" "rx76" "rx76" "rx76" "rx81" "rx81" "rx76" "rx82" "rx81")}, :child-of 52, :start 3197.4600000000005, :duration 1.9049999999997453, :end 3199.3650000000002} {:id 100, :operation :section1/section1, :op-type :sub/create, :tags {:query-v [:section1/section1], :cached? false, :reaction "rx81"}, :child-of 99, :start 3197.4900000000002, :duration 0.14500000000043656, :end 3197.6350000000007} {:id 101, :operation :section1/app-features, :op-type :sub/create, :tags {:query-v [:section1/app-features], :cached? false, :reaction "rx82"}, :child-of 99, :start 3197.7450000000003, :duration 0.23500000000012733, :end 3197.985} {:id 102, :operation :section1/section1, :op-type :sub/create, :tags {:query-v [:section1/section1], :cached? true, :reaction "rx81"}, :child-of 101, :start 3197.8000000000006, :duration 0.03999999999950887, :end 3197.84} {:id 103, :operation :section1/editing-sav, :op-type :sub/create, :tags {:query-v [:section1/editing-sav], :cached? true, :reaction "rx76"}, :child-of 99, :start 3198.0600000000004, :duration 0.03999999999996362, :end 3198.1050000000005} {:id 104, :operation :section1/dirty?, :op-type :sub/create, :tags {:query-v [:section1/dirty?], :cached? false, :reaction "rx83"}, :child-of 99, :start 3198.1800000000003, :duration 0.09000000000014552, :end 3198.2700000000004} {:id 105, :operation :section1/file-name, :op-type :sub/create, :tags {:query-v [:section1/file-name], :cached? false, :reaction "rx84"}, :child-of 99, :start 3198.3450000000003, :duration 0.0749999999998181, :end 3198.42} {:id 106, :operation :section1/section1, :op-type :sub/run, :tags {:query-v [:section1/section1], :reaction "rx81", :input-signals (nil nil nil nil nil), :value nil}, :child-of 99, :start 3198.5950000000003, :duration 0.04500000000007276, :end 3198.6450000000004} {:id 107, :operation :section1/app-features, :op-type :sub/run, :tags {:query-v [:section1/app-features], :reaction "rx82", :input-signals (), :value nil}, :child-of 99, :start 3198.9150000000004, :duration 0.10500000000001819, :end 3199.025} {:id 108, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3199.65, :duration 1.2950000000000728, :end 3200.9500000000003} {:id 109, :operation "acme.myapp.app_ux_common.panel_title", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.app_ux_common.panel_title", :reaction nil, :input-signals nil}, :child-of 52, :start 3201.38, :duration 0.14000000000032742, :end 3201.525} {:id 110, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.app_ux_common.panel_title > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3201.7750000000005, :duration 0.9099999999998545, :end 3202.6850000000004} {:id 111, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3203.1600000000003, :duration 0.3599999999996726, :end 3203.52} {:id 112, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3203.8, :duration 0.9450000000001637, :end 3204.75} {:id 113, :operation "acme.myapp.panels.section1.view.unsaved_changes_popup", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup", :reaction nil, :input-signals nil}, :child-of 52, :start 3205.0950000000003, :duration 0.27999999999974534, :end 3205.375} {:id 114, :operation "re_com.popover.popover_anchor_wrapper", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper", :reaction "rx86", :input-signals ("ra96")}, :child-of 52, :start 3205.6400000000003, :duration 0.875, :end 3206.5200000000004} {:id 115, :operation "popover-anchor-wrapper", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper", :reaction "rx87", :input-signals ("rx97" "ra96" "ra98" "ra99")}, :child-of 52, :start 3206.8050000000003, :duration 1.2549999999996544, :end 3208.0650000000005} {:id 116, :operation "acme.apps_lib.components.icon_button.icon_button", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button", :reaction nil, :input-signals nil}, :child-of 52, :start 3208.465, :duration 0.2699999999999818, :end 3208.735} {:id 117, :operation "re_com.buttons.button", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button", :reaction nil, :input-signals nil}, :child-of 52, :start 3209.0250000000005, :duration 1.2550000000001091, :end 3210.2800000000007} {:id 118, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3210.5800000000004, :duration 2.2299999999995634, :end 3212.8150000000005} {:id 119, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button > re_com.box.box > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3213.4600000000005, :duration 1.074999999999818, :end 3214.5400000000004} {:id 120, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button > re_com.box.box > re_com.box.h_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3215.4100000000003, :duration 0.3949999999999818, :end 3215.8050000000003} {:id 121, :operation "acme.apps_lib.components.load_save.hidden_file_input", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.apps_lib.components.load_save.hidden_file_input", :reaction nil, :input-signals nil}, :child-of 52, :start 3216.225, :duration 0.6449999999999818, :end 3216.8750000000005} {:id 122, :operation "ReagentInput", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.apps_lib.components.load_save.hidden_file_input > ReagentInput", :reaction nil, :input-signals nil}, :child-of 52, :start 3217.135, :duration 0.07000000000016371, :end 3217.2050000000004} {:id 123, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3217.655, :duration 0.31500000000005457, :end 3217.9700000000003} {:id 124, :operation "acme.myapp.panels.section1.view.unsaved_changes_popup", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup", :reaction nil, :input-signals nil}, :child-of 52, :start 3218.26, :duration 0.15000000000009095, :end 3218.4100000000003} {:id 125, :operation "re_com.popover.popover_anchor_wrapper", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper", :reaction "rx88", :input-signals ("ra100")}, :child-of 52, :start 3218.65, :duration 0.6849999999999454, :end 3219.335} {:id 126, :operation "popover-anchor-wrapper", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper", :reaction "rx89", :input-signals ("rx101" "ra100" "ra102" "ra103")}, :child-of 52, :start 3219.5950000000003, :duration 0.7550000000001091, :end 3220.3500000000004} {:id 127, :operation "acme.apps_lib.components.icon_button.icon_button", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button", :reaction nil, :input-signals nil}, :child-of 52, :start 3220.7450000000003, :duration 0.11999999999989086, :end 3220.8700000000003} {:id 128, :operation "re_com.buttons.button", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button", :reaction nil, :input-signals nil}, :child-of 52, :start 3221.255, :duration 0.9200000000005275, :end 3222.1800000000003} {:id 129, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3222.92, :duration 0.6849999999999454, :end 3223.605} {:id 130, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button > re_com.box.box > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3224.015, :duration 0.635000000000673, :end 3224.655} {:id 131, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > acme.myapp.panels.section1.view.unsaved_changes_popup > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > acme.apps_lib.components.icon_button.icon_button > re_com.buttons.button > re_com.box.box > re_com.box.h_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3225.1250000000005, :duration 0.3649999999997817, :end 3225.4900000000002} {:id 132, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > re_com.box.h_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3225.8450000000003, :duration 0.330000000000382, :end 3226.1800000000003} {:id 133, :operation "acme.myapp.panels.section1.welcome.panel", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel", :reaction nil, :input-signals nil}, :child-of 52, :start 3226.525, :duration 0.11000000000012733, :end 3226.6400000000003} {:id 134, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3226.8650000000002, :duration 0.8049999999998363, :end 3227.67} {:id 135, :operation "re_com.text.title", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.text.title", :reaction nil, :input-signals nil}, :child-of 52, :start 3228.0050000000006, :duration 0.3649999999997817, :end 3228.3700000000003} {:id 136, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.text.title > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3228.5800000000004, :duration 0.7049999999999272, :end 3229.2900000000004} {:id 137, :operation "re_com.box.gap", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.gap", :reaction nil, :input-signals nil}, :child-of 52, :start 3229.775, :duration 0.4250000000001819, :end 3230.2050000000004} {:id 138, :operation "re_com.box.v_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.v_box", :reaction nil, :input-signals nil}, :child-of 52, :start 3230.5050000000006, :duration 1.544999999999618, :end 3232.0550000000003} {:id 139, :operation "re_com.popover.popover_anchor_wrapper", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.v_box > re_com.popover.popover_anchor_wrapper", :reaction "rx90", :input-signals ("ra104")}, :child-of 52, :start 3232.76, :duration 0.6300000000001091, :end 3233.3950000000004} {:id 140, :operation "popover-anchor-wrapper", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.v_box > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper", :reaction "rx91", :input-signals ("rx105" "ra104" "ra106" "ra107")}, :child-of 52, :start 3233.78, :duration 1.199999999999818, :end 3234.9850000000006} {:id 141, :operation "re_com.buttons.hyperlink", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.v_box > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > re_com.buttons.hyperlink", :reaction nil, :input-signals nil}, :child-of 52, :start 3235.38, :duration 0.8899999999998727, :end 3236.2750000000005} {:id 142, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.v_box > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > re_com.buttons.hyperlink > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3236.5350000000003, :duration 0.5650000000000546, :end 3237.1000000000004} {:id 143, :operation "re_com.box.box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > > > re_com.box.box > acme.myapp.panels.section1.view.panel > re_com.box.v_box > acme.myapp.panels.section1.welcome.panel > re_com.box.v_box > re_com.box.v_box > re_com.popover.popover_anchor_wrapper > popover-anchor-wrapper > re_com.buttons.hyperlink > re_com.box.box > re_com.box.box", :reaction nil, :input-signals nil}, :child-of 52, :start 3237.4300000000003, :duration 0.5350000000003092, :end 3237.9700000000003} {:id 144, :operation "acme.myapp.main.busy_panel", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel", :reaction "rx67", :input-signals ("rx66")}, :child-of 52, :start 3239.37, :duration 0.0950000000007094, :end 3239.4700000000003} {:id 145, :operation "re_com.modal_panel.modal_panel", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel", :reaction nil}, :child-of 52, :start 3239.64, :duration 0.005000000000563887, :end 3239.6450000000004} {:id 146, :operation "re_com.box.border", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border", :reaction nil}, :child-of 52, :start 3239.84, :duration 0.005000000000109139, :end 3239.8550000000005} {:id 147, :operation "re_com.box.h_box", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box", :reaction nil}, :child-of 52, :start 3239.9950000000003, :duration 0, :end 3240} {:id 148, :operation "re_com.misc.throbber", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber", :reaction nil}, :child-of 52, :start 3240.135, :duration 0, :end 3240.135} {:id 149, :operation "re_com.box.box", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box", :reaction nil}, :child-of 52, :start 3240.2650000000003, :duration 0.004999999999654392, :end 3240.27} {:id 150, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3240.42, :duration 0.005000000000109139, :end 3240.425} {:id 151, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3240.5800000000004, :duration 0.005000000000109139, :end 3240.5850000000005} {:id 152, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3240.73, :duration 0, :end 3240.73} {:id 153, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3240.8700000000003, :duration 0, :end 3240.8700000000003} {:id 154, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3241.0050000000006, :duration 0.004999999999654392, :end 3241.01} {:id 155, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3241.1550000000007, :duration 0, :end 3241.1600000000003} {:id 156, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3241.2950000000005, :duration 0, :end 3241.3} {:id 157, :operation "reagent1", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.misc.throbber > re_com.box.box > reagent1", :reaction nil}, :child-of 52, :start 3241.445, :duration 0, :end 3241.445} {:id 158, :operation "re_com.box.gap", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.box.gap", :reaction nil}, :child-of 52, :start 3241.6050000000005, :duration 0, :end 3241.6050000000005} {:id 159, :operation "re_com.text.label", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.text.label", :reaction nil}, :child-of 52, :start 3241.7400000000002, :duration 0, :end 3241.7400000000002} {:id 160, :operation "re_com.box.box", :op-type :componentWillUnmount, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.busy_panel > re_com.modal_panel.modal_panel > re_com.box.border > re_com.box.h_box > re_com.text.label > re_com.box.box", :reaction nil}, :child-of 52, :start 3241.8700000000003, :duration 0, :end 3241.8700000000003} {:id 161, :operation nil, :op-type :raf-end, :tags nil, :child-of 52, :start 3242.485, :duration 0.005000000000109139, :end 3242.5} {:id 162, :operation nil, :op-type :raf, :tags nil, :child-of nil, :start 3270.0850000000005, :duration 13.139999999999873, :end 3283.23} {:id 163, :operation :navigation/visible?, :op-type :sub/run, :tags {:query-v [:navigation/visible?], :reaction "rx71", :input-signals (nil nil), :value true}, :child-of 162, :start 3270.1200000000003, :duration 0.13999999999987267, :end 3270.2650000000003} {:id 164, :operation "acme.myapp.main.main", :op-type :render, :tags {:component-path "acme.myapp.main.main", :reaction "rx65", :input-signals ("ra93" "rx64")}, :child-of 162, :start 3270.635, :duration 0.2899999999999636, :end 3270.925} {:id 165, :operation :boot-state, :op-type :sub/create, :tags {:query-v [:boot-state], :cached? true, :reaction "rx64"}, :child-of 164, :start 3270.6600000000003, :duration 0.07999999999992724, :end 3270.7400000000002} {:id 166, :operation "acme.myapp.main.app_notification", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_notification", :reaction "rx69", :input-signals ("ra93" "rx68")}, :child-of 162, :start 3271.23, :duration 0.19000000000050932, :end 3271.425} {:id 167, :operation :app-notification, :op-type :sub/create, :tags {:query-v [:app-notification], :cached? true, :reaction "rx68"}, :child-of 166, :start 3271.2550000000006, :duration 0.06499999999959982, :end 3271.3250000000003} {:id 168, :operation "acme.myapp.main.app_content", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content", :reaction "rx77", :input-signals ("rx71" "rx71" "rx73" "ra94" "rx70")}, :child-of 162, :start 3271.6300000000006, :duration 1.1899999999995998, :end 3272.8250000000003} {:id 169, :operation "acme.myapp.main.sidepanel_tab_list", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list", :reaction "rx78", :input-signals ("ra93" "rx72" "ra93")}, :child-of 162, :start 3273.13, :duration 0.34999999999990905, :end 3273.4850000000006} {:id 170, :operation :site-config, :op-type :sub/create, :tags {:query-v [:site-config], :cached? true, :reaction "rx72"}, :child-of 169, :start 3273.1600000000003, :duration 0.06499999999959982, :end 3273.225} {:id 171, :operation :navigation/page, :op-type :sub/create, :tags {:query-v [:navigation/page], :cached? true, :reaction "rx70"}, :child-of 169, :start 3273.315, :duration 0.04000000000041837, :end 3273.3550000000005} {:id 172, :operation "acme.myapp.components.nav_tabs.tabs_v", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v", :reaction "rx79", :input-signals ("rx70" "ra95" "ra95" "ra95" "ra95")}, :child-of 162, :start 3273.675, :duration 0.599999999999909, :end 3274.28} {:id 173, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 162, :start 3274.65, :duration 0.6200000000003456, :end 3275.275} {:id 174, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 162, :start 3275.635, :duration 0.5900000000001455, :end 3276.2250000000004} {:id 175, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 162, :start 3276.5700000000006, :duration 0.5649999999995998, :end 3277.135} {:id 176, :operation "re_com.box.h_box", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.sidepanel_tab_list > acme.myapp.components.nav_tabs.tabs_v > re_com.box.h_box", :reaction nil, :input-signals nil}, :child-of 162, :start 3277.525, :duration 0.7199999999997999, :end 3278.2500000000005} {:id 177, :operation "acme.myapp.main.system_version", :op-type :render, :tags {:component-path "acme.myapp.main.main > re_com.box.v_box > acme.myapp.main.app_content > re_com.box.h_box > re_com.box.scroller > re_com.box.v_box > acme.myapp.main.system_version", :reaction "rx80", :input-signals ("ra93" "rx73" "ra93" "rx72")}, :child-of 162, :start 3278.6700000000005, :duration 0.32999999999992724, :end 3279.005} {:id 178, :operation :system-name, :op-type :sub/create, :tags {:query-v [:system-name], :cached? true, :reaction "rx73"}, :child-of 177, :start 3278.7150000000006, :duration 0.04999999999972715, :end 3278.77} {:id 179, :operation :site-config, :op-type :sub/create, :tags {:query-v [:site-config], :cached? true, :reaction "rx72"}, :child-of 177, :start 3278.84, :duration 0.04000000000041837, :end 3278.885} {:id 180, :operation nil, :op-type :raf-end, :tags nil, :child-of 162, :start 3279.1050000000005, :duration 0, :end 3279.1050000000005} {:id 181, :operation nil, :op-type :reagent/quiescent, :tags nil, :child-of 162, :start 3283.125, :duration 0.010000000000218279, :end 3283.155}] diff --git a/test/day8/re_frame/trace/graph_test.clj b/test/day8/re_frame/trace/graph_test.clj deleted file mode 100644 index 00d78be..0000000 --- a/test/day8/re_frame/trace/graph_test.clj +++ /dev/null @@ -1,53 +0,0 @@ -(ns day8.re-frame.trace.graph-test - (:require [day8.re-frame.trace.graph :as graph] - [clojure.test :refer :all])) - -(def t1 - '({:id 1, :operation :initialise-db, :type :event, :tags {:event [:initialise-db]}, :child-of nil} - {:id 2, :operation "todomvc.core.wrapper", :type :render, :tags {:component-path "todomvc.core.wrapper", :reaction "rx2", :input-signals ("ra18")}, :child-of nil} - {:id 5, :operation :sorted-todos, :type :sub/create, :tags {:query-v [:sorted-todos], :cached? false, :reaction "rx3"}, :child-of 4} - {:id 4, :operation :todos, :type :sub/create, :tags {:query-v [:todos], :cached? false, :reaction "rx4"}, :child-of 3} - {:id 7, :operation :sorted-todos, :type :sub/run, :tags {:query-v [:sorted-todos], :reaction "rx3", :input-signals ["ra5"]}, :child-of 6} - {:id 6, :operation :todos, :type :sub/run, :tags {:query-v [:todos], :reaction "rx4", :input-signals ["rx3"]}, :child-of 3} - {:id 3, :operation "todomvc.views.todo_app", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app", :reaction "rx6", :input-signals ("rx4")}, :child-of nil} - {:id 8, :operation "todomvc.views.task_entry", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_entry", :reaction nil, :input-signals nil}, :child-of nil} - {:id 9, :operation "todomvc.views.todo_input", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_entry > todomvc.views.todo_input", :reaction "rx7", :input-signals ("ra19")}, :child-of nil} - {:id 10, :operation "ReagentInput", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_entry > todomvc.views.todo_input > ReagentInput", :reaction nil, :input-signals nil}, :child-of nil} - {:id 13, :operation :todos, :type :sub/create, :tags {:query-v [:todos], :cached? true, :reaction "rx4"}, :child-of 12} - {:id 14, :operation :showing, :type :sub/create, :tags {:query-v [:showing], :cached? false, :reaction "rx8"}, :child-of 12} - {:id 12, :operation :visible-todos, :type :sub/create, :tags {:query-v [:visible-todos], :cached? false, :reaction "rx9"}, :child-of 11} - {:id 16, :operation :todos, :type :sub/create, :tags {:query-v [:todos], :cached? true, :reaction "rx4"}, :child-of 15} - {:id 15, :operation :all-complete?, :type :sub/create, :tags {:query-v [:all-complete?], :cached? false, :reaction "rx10"}, :child-of 11} - {:id 17, :operation :all-complete?, :type :sub/run, :tags {:query-v [:all-complete?], :reaction "rx10", :input-signals ["rx4"]}, :child-of 11} - {:id 19, :operation :showing, :type :sub/run, :tags {:query-v [:showing], :reaction "rx8", :input-signals ["ra5"]}, :child-of 18} - {:id 18, :operation :visible-todos, :type :sub/run, :tags {:query-v [:visible-todos], :reaction "rx9", :input-signals ("rx4" "rx8")}, :child-of 11} - {:id 11, :operation "todomvc.views.task_list", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_list", :reaction "rx11", :input-signals ("rx10" "rx9")}, :child-of nil} - {:id 20, :operation "ReagentInput", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_list > ReagentInput", :reaction nil, :input-signals nil}, :child-of nil} - {:id 21, :operation "todomvc.views.todo_item", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_list > todomvc.views.todo_item", :reaction "rx12", :input-signals ("ra20" "ra20")}, :child-of nil} - {:id 22, :operation "ReagentInput", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.task_list > todomvc.views.todo_item > ReagentInput", :reaction nil, :input-signals nil}, :child-of nil} - {:id 24, :operation :footer-counts, :type :sub/create, :tags {:query-v [:footer-counts], :cached? false, :reaction "rx13"}, :child-of 23} - {:id 25, :operation :showing, :type :sub/create, :tags {:query-v [:showing], :cached? true, :reaction "rx8"}, :child-of 23} - {:id 27, :operation :todos, :type :sub/create, :tags {:query-v [:todos], :cached? true, :reaction "rx4"}, :child-of 26} - {:id 29, :operation :todos, :type :sub/create, :tags {:query-v [:todos], :cached? true, :reaction "rx4"}, :child-of 28} - {:id 28, :operation :completed-count, :type :sub/create, :tags {:query-v [:completed-count], :cached? false, :reaction "rx14"}, :child-of 26} - {:id 30, :operation :completed-count, :type :sub/run, :tags {:query-v [:completed-count], :reaction "rx14", :input-signals ["rx4"]}, :child-of 26} - {:id 26, :operation :footer-counts, :type :sub/run, :tags {:query-v [:footer-counts], :reaction "rx13", :input-signals ("rx4" "rx14")}, :child-of 23} - {:id 23, :operation "todomvc.views.footer_controls", :type :render, :tags {:component-path "todomvc.core.wrapper > todomvc.views.todo_app > todomvc.views.footer_controls", :reaction "rx15", :input-signals ("rx13" "rx8" "rx8" "rx8")}, :child-of nil})) - -(deftest sub-graph-test - (is (= {:links [] - :nodes [{:id "rx4" - :r 10 - :title "" - :group 2 - :data {:id 1 - :tags {:cached? false - :reaction "rx4"} - :type :sub/create}}]} - (graph/trace->sub-graph [{:id 1 :type :sub/create :tags {:cached? false :reaction "rx4"}}] [])))) - -(deftest dispose-view-test - (is (= {:links [] - :nodes []} - (graph/trace->sub-graph [{:id 1 :type :render :tags {:cached? false :reaction "rx4"}} - {:id 2 :type :componentWillUnmount :tags {:reaction "rx4"}}] [])))) diff --git a/test/day8/re_frame/trace/metamorphic_test.clj b/test/day8/re_frame/trace/metamorphic_test.clj index d7a8c8e..c180a7d 100644 --- a/test/day8/re_frame/trace/metamorphic_test.clj +++ b/test/day8/re_frame/trace/metamorphic_test.clj @@ -2,15 +2,38 @@ (:require [clojure.test :refer :all]) (:require [day8.re-frame.trace.metamorphic :as m])) -(deftest parse-events-test - (= (m/parse-events) - '(({:id 327, - :operation [:idle :add-event], - :op-type :re-frame.router/fsm-trigger, - :tags {:current-state :idle, :new-state :scheduled}} - {:id 329, :operation :estimate/new, :op-type :event, :tags {:event [:estimate/new]}} - {:id 330, - :operation [:running :finish-run], - :op-type :re-frame.router/fsm-trigger, - :tags {:current-state :running, :new-state :idle}})) - )) +(defn trace-events [file] + (->> (slurp (str "test-resources/" file)) + (clojure.edn/read-string {:readers {'utc identity + 'object (fn [x] "")}}) + (sort-by :id))) + +(deftest parse-app-trace1-test + (let [rt (m/parse-traces (trace-events "app-trace1.edn")) + matches (:matches rt) + [m1 m2 m3 m4 m5 m6] matches] + (is (= (count matches) 6)) + + (is (= (m/beginning-id m1) 1)) + (is (= (m/ending-id m1) 34)) + (is (= (:operation (m/matched-event m1)) :bootstrap)) + + (is (= (m/beginning-id m2) 35)) + (is (= (m/ending-id m2) 38)) + (is (= (:operation (m/matched-event m2)) :acme.myapp.events/boot-flow)) + + (is (= (m/beginning-id m3) 39)) + (is (= (m/ending-id m3) 42)) + (is (= (:operation (m/matched-event m3)) :acme.myapp.events/init-db)) + + (is (= (m/beginning-id m4) 43)) + (is (= (m/ending-id m4) 47)) + (is (= (:operation (m/matched-event m4)) :acme.myapp.events/boot-flow)) + + (is (= (m/beginning-id m5) 48)) + (is (= (m/ending-id m5) 49)) + (is (= (:operation (m/matched-event m5)) :acme.myapp.events/start-intercom)) + + (is (= (m/beginning-id m6) 50)) + (is (= (m/ending-id m6) 181)) + (is (= (:operation (m/matched-event m6)) :acme.myapp.events/success-bootstrap))))