struct BST {
  data : i32;
  leftIndex : i32;
  rightIndex : i32;
};

struct buf0 {
  injectionSwitch : vec2<f32>;
};

var<private> tree_1 : array<BST, 10>;

@group(0) @binding(0) var<uniform> x_16 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
  let x_165 : i32 = *(data);
  (*(tree)).data = x_165;
  (*(tree)).leftIndex = -1;
  (*(tree)).rightIndex = -1;
  return;
}

fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
  var baseIndex : i32;
  var param : BST;
  var param_1 : i32;
  var x_170 : i32;
  var param_2 : BST;
  var param_3 : i32;
  baseIndex = 0;
  loop {
    let x_175 : i32 = baseIndex;
    let x_176 : i32 = *(treeIndex);
    if ((x_175 <= x_176)) {
    } else {
      break;
    }
    let x_179 : i32 = *(data_1);
    let x_180 : i32 = baseIndex;
    let x_182 : i32 = tree_1[x_180].data;
    if ((x_179 <= x_182)) {
      let x_187 : i32 = baseIndex;
      let x_189 : i32 = tree_1[x_187].leftIndex;
      if ((x_189 == -1)) {
        let x_194 : i32 = baseIndex;
        let x_195 : i32 = *(treeIndex);
        tree_1[x_194].leftIndex = x_195;
        let x_198 : f32 = x_16.injectionSwitch.x;
        let x_200 : f32 = x_16.injectionSwitch.y;
        if ((x_198 < x_200)) {
          let x_204 : i32 = *(treeIndex);
          let x_206 : BST = tree_1[x_204];
          param = x_206;
          let x_207 : i32 = *(data_1);
          param_1 = x_207;
          makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
          let x_209 : BST = param;
          tree_1[x_204] = x_209;
        }
        let x_212 : f32 = x_16.injectionSwitch.x;
        let x_214 : f32 = x_16.injectionSwitch.y;
        if ((x_212 < x_214)) {
          return;
        }
      } else {
        let x_218 : i32 = baseIndex;
        let x_220 : i32 = tree_1[x_218].leftIndex;
        baseIndex = x_220;
        continue;
      }
    } else {
      let x_222 : f32 = x_16.injectionSwitch.x;
      let x_224 : f32 = x_16.injectionSwitch.y;
      if ((x_222 < x_224)) {
        let x_229 : i32 = baseIndex;
        let x_231 : i32 = tree_1[x_229].rightIndex;
        x_170 = x_231;
      } else {
        let x_232 : i32 = baseIndex;
        let x_234 : i32 = tree_1[x_232].rightIndex;
        x_170 = x_234;
      }
      let x_235 : i32 = x_170;
      if ((x_235 == -1)) {
        let x_240 : i32 = baseIndex;
        let x_241 : i32 = *(treeIndex);
        tree_1[x_240].rightIndex = x_241;
        let x_243 : i32 = *(treeIndex);
        let x_245 : BST = tree_1[x_243];
        param_2 = x_245;
        let x_246 : i32 = *(data_1);
        param_3 = x_246;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
        let x_248 : BST = param_2;
        tree_1[x_243] = x_248;
        return;
      } else {
        let x_250 : i32 = baseIndex;
        let x_252 : i32 = tree_1[x_250].rightIndex;
        baseIndex = x_252;
        continue;
      }
      return;
    }
    let x_254 : f32 = x_16.injectionSwitch.x;
    let x_256 : f32 = x_16.injectionSwitch.y;
    if ((x_254 > x_256)) {
      return;
    }
  }
  return;
}

fn search_i1_(target : ptr<function, i32>) -> i32 {
  var index : i32;
  var currentNode : BST;
  var x_261 : i32;
  index = 0;
  loop {
    let x_266 : i32 = index;
    if ((x_266 != -1)) {
    } else {
      break;
    }
    let x_269 : i32 = index;
    let x_271 : BST = tree_1[x_269];
    currentNode = x_271;
    let x_273 : i32 = currentNode.data;
    let x_274 : i32 = *(target);
    if ((x_273 == x_274)) {
      let x_278 : i32 = *(target);
      return x_278;
    }
    let x_279 : i32 = *(target);
    let x_281 : i32 = currentNode.data;
    if ((x_279 > x_281)) {
      let x_287 : i32 = currentNode.rightIndex;
      x_261 = x_287;
    } else {
      let x_289 : i32 = currentNode.leftIndex;
      x_261 = x_289;
    }
    let x_290 : i32 = x_261;
    index = x_290;
  }
  return -1;
}

fn main_1() {
  var treeIndex_1 : i32;
  var param_4 : BST;
  var param_5 : i32;
  var param_6 : i32;
  var param_7 : i32;
  var param_8 : i32;
  var param_9 : i32;
  var param_10 : i32;
  var param_11 : i32;
  var param_12 : i32;
  var param_13 : i32;
  var param_14 : i32;
  var param_15 : i32;
  var param_16 : i32;
  var param_17 : i32;
  var param_18 : i32;
  var param_19 : i32;
  var param_20 : i32;
  var param_21 : i32;
  var param_22 : i32;
  var param_23 : i32;
  var count : i32;
  var i : i32;
  var result : i32;
  var param_24 : i32;
  treeIndex_1 = 0;
  let x_91 : BST = tree_1[0];
  param_4 = x_91;
  param_5 = 9;
  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
  let x_93 : BST = param_4;
  tree_1[0] = x_93;
  let x_95 : i32 = treeIndex_1;
  treeIndex_1 = (x_95 + 1);
  let x_97 : i32 = treeIndex_1;
  param_6 = x_97;
  param_7 = 5;
  insert_i1_i1_(&(param_6), &(param_7));
  let x_99 : i32 = treeIndex_1;
  treeIndex_1 = (x_99 + 1);
  let x_101 : i32 = treeIndex_1;
  param_8 = x_101;
  param_9 = 12;
  insert_i1_i1_(&(param_8), &(param_9));
  let x_103 : i32 = treeIndex_1;
  treeIndex_1 = (x_103 + 1);
  let x_105 : i32 = treeIndex_1;
  param_10 = x_105;
  param_11 = 15;
  insert_i1_i1_(&(param_10), &(param_11));
  let x_107 : i32 = treeIndex_1;
  treeIndex_1 = (x_107 + 1);
  let x_109 : i32 = treeIndex_1;
  param_12 = x_109;
  param_13 = 7;
  insert_i1_i1_(&(param_12), &(param_13));
  let x_111 : i32 = treeIndex_1;
  treeIndex_1 = (x_111 + 1);
  let x_113 : i32 = treeIndex_1;
  param_14 = x_113;
  param_15 = 8;
  insert_i1_i1_(&(param_14), &(param_15));
  let x_115 : i32 = treeIndex_1;
  treeIndex_1 = (x_115 + 1);
  let x_117 : i32 = treeIndex_1;
  param_16 = x_117;
  param_17 = 2;
  insert_i1_i1_(&(param_16), &(param_17));
  let x_119 : i32 = treeIndex_1;
  treeIndex_1 = (x_119 + 1);
  let x_121 : i32 = treeIndex_1;
  param_18 = x_121;
  param_19 = 6;
  insert_i1_i1_(&(param_18), &(param_19));
  let x_123 : i32 = treeIndex_1;
  treeIndex_1 = (x_123 + 1);
  let x_125 : i32 = treeIndex_1;
  param_20 = x_125;
  param_21 = 17;
  insert_i1_i1_(&(param_20), &(param_21));
  let x_127 : i32 = treeIndex_1;
  treeIndex_1 = (x_127 + 1);
  let x_129 : i32 = treeIndex_1;
  param_22 = x_129;
  param_23 = 13;
  insert_i1_i1_(&(param_22), &(param_23));
  count = 0;
  i = 0;
  loop {
    let x_135 : i32 = i;
    if ((x_135 < 20)) {
    } else {
      break;
    }
    let x_138 : i32 = i;
    param_24 = x_138;
    let x_139 : i32 = search_i1_(&(param_24));
    result = x_139;
    let x_140 : i32 = i;
    switch(x_140) {
      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
        let x_150 : i32 = result;
        let x_151 : i32 = i;
        if ((x_150 == x_151)) {
          let x_155 : i32 = count;
          count = (x_155 + 1);
        }
      }
      default: {
        let x_144 : i32 = result;
        if ((x_144 == -1)) {
          let x_148 : i32 = count;
          count = (x_148 + 1);
        }
      }
    }

    continuing {
      let x_157 : i32 = i;
      i = (x_157 + 1);
    }
  }
  let x_159 : i32 = count;
  if ((x_159 == 20)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
  }
  return;
}

struct main_out {
  @location(0)
  x_GLF_color_1 : vec4<f32>;
};

@stage(fragment)
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
